네이티브 추론: C 포인터 로직에서 SLM (L3.1-8B-I) 테스트
Source: Dev.to
설정
저는 최근에 Linux Debian 노트북에 llama-cli를 설치하고 네이티브 추론으로 실행했습니다—Linux 명령과 플래그를 사용해 llama-cli 바이너리를 직접 실행하는 방식입니다. 소스에서 컴파일하면서 특정 CPU 플래그(예: AVX‑512)를 지정해 하드웨어 성능을 최대한 활용할 수 있었습니다.
이번 테스트에 사용한 모델은 다음과 같습니다:
- Llama 3.1 8B Instruct (Q4_K_M GGUF) – 본문 전체에서 Llama‑3.1이라고 부릅니다.
목표는 모델이 포인터 로직을 포함한 간단한 C 프로그램을 어떻게 처리하는지 확인하는 것이었습니다.
C 프로그램
#include
#include
#include
int main() {
char *buffer = malloc(100 * sizeof(char));
if (buffer == NULL) {
return 1;
}
strcpy(buffer, "Llama 3.1 is running close to the metal.");
printf("Buffer content: %s\n", buffer);
// Intentional bug: No free(buffer) here.
return 0;
}
모델에 제공한 프롬프트
여기서 메모리 할당을 단계별로 설명해 주세요.
Llama‑3.1의 응답
코드에서 메모리 할당에 대한 단계별 설명은 다음과 같습니다:
char *buffer = malloc(100 * sizeof(char));
malloc은 요청된 크기의 메모리 블록을 동적으로 할당합니다.100 * sizeof(char)은sizeof(char)가 1이므로 100바이트와 같습니다.- 할당된 블록은 포인터
buffer에 저장됩니다.- 할당에 실패하면
malloc은NULL을 반환합니다.
if (buffer == NULL) { … }
- 할당이 성공했는지 확인합니다.
buffer가NULL이면 프로그램이 오류 코드 1로 종료됩니다.
strcpy(buffer, "Llama 3.1 is running close to the metal.");
- 문자열을 할당된 메모리로 복사합니다.
- 할당된 블록이 100 바이트이므로 복사가 성공하고, 남은 바이트는 초기화되지 않은 상태로 남습니다.
free(buffer);
malloc으로 할당된 메모리를 해제합니다.- 메모리 누수를 방지하기 위해 이 단계가 필요합니다.
참고: 실제 프로그램에서는 일반적으로
malloc의 반환값을 확인하고, 더 이상 필요하지 않을 때 메모리를 해제합니다.
모델 출력 분석
환각(Hallucination)
원본 소스 코드에는 free(buffer); 호출이 없습니다. Llama‑3.1은 이 줄을 잘못 추가했으며, 이는 모델이 흔히 권장되는 베스트 프랙티스를 “환각”한 전형적인 사례입니다.
정확도
malloc과 널 포인터 검사에 대해서는 정확히 설명했습니다.free(buffer);존재를 잘못 식별했습니다.
수학 검증
모델은 문자열 복사 후 86바이트가 남는다고 주장했습니다.
실제 문자열 "Llama 3.1 is running close to the metal."은 39자이며, 종료 널 바이트를 포함하면 40 바이트를 차지합니다.
따라서 남은 공간은 100 – 40 = 60 바이트이며, 86이 아닙니다.
시사점
- 인간 검증이 필수입니다. 8 B 모델이라 할지라도 설득력 있지만 잘못된 코드를 삽입할 수 있습니다.
- 프롬프트 엔지니어링이 중요합니다. 정확한 프롬프트는 모델을 유도하지만 환각을 완전히 없앨 수는 없습니다.
- 하드웨어 측면의 성공. AVX‑512(또는 구형 하드웨어에서는 AVX‑2)를 사용해 8 B 모델을 실행함으로써 GPU 없이도 유용한 추론이 가능함을 보여주었으며, 온‑디바이스 AI 접근성을 높였습니다.
Ben Santora – 2026년 1월