본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 05. 24. 01:47

【간단】llama.cpp로 요구에 응답하는 AI를 구동해 보았다

요약

llama.cpp를 사용하여 SmolLM3-3B 모델을 로컬 환경에서 구동하는 과정을 설명합니다. CanIRun.ai를 통해 하드웨어 사양에 맞는 모델과 양자화 품질을 선택하고, Hugging Face에서 GGUF 파일을 다운로드하여 서버를 실행하는 방법을 다룹니다.

핵심 포인트

  • CanIRun.ai로 VRAM 및 예상 속도 확인
  • Hugging Face에서 적절한 GGUF 양자화 파일 선택
  • llama.cpp 바이너리 다운로드 및 환경 설정
  • llama-server 명령어를 통한 로컬 HTTP 서버 기동

정보를 참고하여 구동할 AI를 선택한다.

이 페이지를 열면 상단에 GPU를 선택하는 칸이 있으므로, 구동할 머신에 맞춰 선택한다.

(운이 좋다면? 자동으로 인식해 줄지도……?)

그러면 페이지 상의 각 AI에 대해

  • 데이터 사이즈가 VRAM 용량과 비교해 어느 정도인지
  • 예상 처리 속도 (tok/s)
  • 평가 텍스트와 스코어

가 표시되므로, 이러한 정보나 라이선스 등을 참고하여 선택한다.

이번에는 「SmolLM3 3B」를 선택했다.

각 AI의 행이 링크로 되어 있어, (클릭 등으로) 링크로 이동하면 해당 AI의 품질·데이터 사이즈·예상 속도 표가 나타난다.

「VRAM」 열의 값이 나중에 다운로드할 AI 파일의 사이즈에 가까운 값이 되어 있는 듯하다.

기대하는 품질이나 할당된 스토리지 용량 등에 따라 선택하면 좋을 것 같다.

이번에는 「Q4_K_M」을 선택했다.

위 페이지의 「llama.cpp / GGUF」 아래에 있는 「Download GGUF from HuggingFace」 링크로 이동하면, AI 다운로드 원본 후보가 많이 표시된다.

선택한 품질의 이름 (예를 들어 「Q4_K_M」)이 후보 이름에 포함되어 있다면, 그곳에 해당 품질의 AI가 있을 가능성이 높다.

품질 이름이 포함되어 있지 않은 후보에서는 여러 품질의 AI를 다운로드할 수 있는 경우가 있다.

예를 들어, 상단에 표시된

ggml-org/SmolLM3-3B-GGUF · Hugging Face

에서는 「Q4_K_M」, 「Q8_0」, 「F16」의 3가지 품질의 AI를 다운로드할 수 있는 듯하다.

품질 이름이 후보 이름에 들어있지 않은 품질을 사용하고 싶을 경우, 다운로드 가능한 후보를 직접 찾아내야 하므로 고생할 수도 있다.

품질 이름이 후보 이름에 포함된 후보가 있는 품질을 사용하는 것이 편할 것이다.

이번에는 품질 이름이 후보 이름에 포함된

enacimie/SmolLM3-3B-Q4_K_M-GGUF · Hugging Face

를 선택했다.

이 페이지 내의 「Files and versions」를 클릭하면 파일 목록 화면이 된다.

그중에서 smollm3-3b-q4_k_m.gguf를 다운로드한다.

파일명 클릭 시 파일 상세 정보가 열릴 뿐이지만, 행 중간쯤에 있는 아래 화살표가 그려진 버튼을 클릭함으로써 다운로드할 수 있다.

CanIRun.ai 페이지에도 적혀 있었던 「llama.cpp」라는 소프트웨어를 사용함으로써 AI를 구동할 수 있는 듯하다.

GitHub - ggml-org/llama.cpp: LLM inference in C/C++ · GitHub

Releases 내의 Assets에서 각 환경용 바이너리 (실행 파일)를 다운로드할 수 있는 듯하다.

이번에는 실험을 진행한 시점의 최신 버전인 b9222에서 llama-b9222-bin-win-vulkan-x64.zip을 다운로드했다.

Assets는 일부가 숨겨져 있는 경우가 있다.

원하는 파일이 없다고 성급하게 판단하지 않도록 주의하자.

이 파일은 루트에 여러 파일이 수납된 zip 파일이므로, 새 디렉터리 안에 압축을 푸는 것이 좋을 것이다.

이번에는 AI 파일인 smollm3-3b-q4_k_m.gguf가 있는 디렉터리를 압축 해제 대상으로 지정했다.

llama.cpp를 압축 해제한 디렉터리를 작업 디렉터리로 하는 터미널 (명령 프롬프트)을 열고, 다음 명령을 실행한다.

llama-server -m ..\smollm3-3b-q4_k_m.gguf --port 8081

그러면 AI에게 요구를 수행할 수 있는 Web (HTTP) 서버가 기동한다.

-m 옵션으로 사용할 AI 파일을 지정하고, --port 옵션으로 통신을 대기할 포트를 지정한다.

환경에 따라서는 현재 디렉터리의 파일을 실행함을 나타내는 ./를 붙이지 않으면 동작하지 않을 수도 있다.

이렇게 서버를 기동하고 웹 브라우저로 http://localhost:8081/에 접속하면 다음과 같은 화면이 나타난다.

중앙의 Type a message... 부분에 AI에 대한 요구를 입력하고, 오른쪽 하단의 화살표 버튼을 누름으로써 AI에게 요구를 보낼 수 있다.

실제로 「SmolLM3 3B」에 몇 가지 요구를 한 번씩 수행하여 결과를 확인해 보았다.

또한, Perplexity에도 동일한 요구를 한 번씩 수행하여 결과를 비교해 보았다.

Perplexity는 로그인하지 않은 상태에서 사용했다. (따라서 모델 지정이나 모드 선택은 불가능하다)

출력된 내용은 기본적으로 그대로 게재했으나, 이 기사 내에서 제대로 표시되도록 하기 위해 일부 마크업 (Markup)을 변경했다.

lama.cpp에서는 AI의 처리 결과 아래에 토큰 수, 처리 시간, 처리 속도가 표시된다.

CanIRun.ai 상의 예상 속도는 90 t/s였던 것에 반해, 이번 실제 처리 속도는 90100 t/s 정도로 예상보다 약간 빨랐다.

大石泉すき

<think> </think>

大石泉은 일본 홋카이도 북부, 이시카리 진키부 지역에 소재하는 자연공원입니다. 특히 알려진 것은 사슴이나 곰 등의 동물이 살고 있는 이 지역의 풍요로운 자연과 아름다운 자연 경관입니다. 특히 大石泉은 홋카이도 자연의 보물창고 중 하나로 알려져 있어 많은 자연 애호가와 여행객이 방문합니다.

大石泉 자연공원은 풍요로운 삼림이나 호수, 그리고 산악 지형이 특징입니다. 주요 경관으로는 이시카리호나 나카노쿠니호 등의 호수, 그리고 산악 지형의 자연 경관이 볼거리입니다. 또한 자연의 보물창고로서 많은 야생 동물이 서식하고 있다는 점도 大石泉의 매력 중 하나입니다.

大石泉 자연공원은 국립공원으로 지정되어 있어 자연의 보호와 보전이 중요시되고 있습니다. 동시에 자연과 함께 즐기기 위한 관광 시설이나 투어리스트 시설이 정비되어 있어 자연을 즐기기 위한 다양한 활동이 이루어지고 있습니다.

大石泉 자연공원으로의 액세스(Access)는 홋카이도 이시카리시나 삿포로시에서 차로 약 2시간 미만입니다. 자연공원 입원료는 무료로 되어 있어 무료로 자연의 매력을 즐길 수 있습니다.

大石泉すき, 좋네요. 『아이돌 마스터 신데렐라 걸즈』의 大石泉을 좋아한다고 나타내는 관용구로, 「すき(스키)」는 히라가나로 쓰는 것이 통례입니다. dic.nicovideo

大石泉은 프로그래밍을 잘하는 15세로, 지적임과 열정을 동시에 갖춘 캐릭터입니다. cinderellagirls.idolmaster-official

이 표현은 팬들 사이에서 퍼져 관련 커뮤니티에서는 꽤 친숙한 표현이 되었습니다. dic.pixiv

大石泉의 어떤 점이 좋은지 이야기하고 싶어지는 타입의 캐릭터죠. cinderellagirls.idolmaster-official

SmolLM3 3B의 출력은 엉터리다.

Lorem ipsum 대신 사용하는 더미 텍스트 (Dummy text)로라면 쓸 수 있으려나……? 하지만 예상치 못한 사고의 원인이 될 것 같으니 그만두는 게 좋으려나……?

참고로, 이즈미 자연공원(泉自然公園)이라면 지바에 있는 것 같다. 大石泉すき.

한편, Perplexity는 大石泉이나 「大石泉すき」에 대해 제대로 인식하고 있는 듯하다.

빵은 빵인데 먹을 수 없는 빵은 무엇일까요?

<think> </think>

먹을 수 없는 빵이란, 빵이 아니거나 혹은 빵으로 착각하기 쉬운 다른 식품을 가리킵니다. 구체적인 예로는 예를 들어 「호박빵」이나 「감자빵」 같은 가공식품을 들 수 있습니다. 다만, 이러한 식품들은 빵과 구분이 어려워 잘못 먹을 경우 위장 문제를 일으킬 가능성이 있습니다. 먹을 수 없는 빵으로는 「두부빵」이나 「두유빵」 등 콩 제품이나 식물성 유를 사용한 빵도 있습니다. 다만, 이러한 식품들은 전반적으로 건강에 뛰어난 선택지가 되므로 특별한 문제는 없습니다.

프라이팬입니다. 전형적인 수수께끼(Riddle)네요.

SmolLM3 3B는 이상한 출력을 하고 있다.

「먹을 수 없다」고 말하고 있음에도 불구하고, 통상적으로는 먹을 수 있는 「식품」을 나열하고 있다.

게다가 후반부에서는 스스로 「특별한 문제는 없습니다」라고 마무리하고 있다.

먹을 수 없는 이유로는 「입이나 식도로 물리적으로 들어가지 않는다」, 「먹으면 위험하다」 외에도 「입수할 수 없다」, 「금지되어 있다」 등도 생각할 수 있으므로 틀렸다고 단정할 수는 없지만, 부자연스럽다는 인상이 강하다.

한편, Perplexity는 이것이 「수수께끼」임을 간파하여 지적하고, 올바른 최소한의 출력으로 끝맺고 있다.

위는 큰 물(大水), 아래는 큰 불(大火事), 이것은 무엇일까요?

<think> </think>

이것은 천재지변 현상입니다. 위쪽 지역에서 큰 물이 발생하는 한편, 아래쪽 지역에서 큰 불이 발생하는 경우입니다.

큰 물은 강우량이 너무 많거나 지형 및 하천 상황이 나쁘기 때문에 물이 넘쳐흘러 홍수가 발생하는 현상입니다. 이로 인해 도로와 가옥이 침수되는 등 지역 생활과 경제에 큰 영향을 미칩니다.

대화재 (Great Fire)는 화재로 인해 불이 번져 지역의 건물이나 자연환경이 소실되는 현상입니다. 이는 전기 공사의 미비, 또는 화재의 원인이 되는 물질에 불이 붙어 번짐으로써 발생합니다. 또한, 지역의 전력망이 파괴됨으로써 지역의 생활이나 통신이 끊기는 경우도 있습니다.

이러한 두 가지 천재지변은 지역의 안전과 생활에 큰 리스크를 초래합니다. 두 가지 천재지변이 발생하는 것은 지역의 자연환경이나 지형 등이 복잡한 요인으로 인해 유발될 수 있기 때문입니다. 예를 들어, 산악 지대 지역에서 폭우가 내리는 동시에 하류 지역에서는 화재가 발생하는 경우도 있습니다.

정답은 "목욕(お風呂)"입니다. 위로는 뜨거운 물의 대홍수(大水), 아래로는 아궁이의 대화재(大火事)라는 의미군요.

SmolLM3 3B는 장문으로 진지하게 답변해 왔다.

이번에는 겉보기에 이상한 점은 없어 보인다.

한편, Perplexity는 "수수께끼"라는 직구 형태의 지적은 하지 않았지만, 전형적인 수수께끼의 답을 내놓았다.

다음 조건에 맞는 C 프로그램을 작성하세요:

  1. 표준 입력 (Standard Input)으로부터 정수를 읽습니다. 이 숫자는 2단계에서 읽을 숫자의 개수입니다.

  2. 첫 번째로 읽은 숫자에 따라 표준 입력으로부터 부동 소수점 (Floating-point) 숫자들을 읽습니다.

  3. 2단계에서 읽은 숫자들의 평균을 표준 출력 (Standard Output)에 출력합니다.

<think> </think>

다음은 주어진 요구 사항을 충족하는 C 프로그램입니다:

#include <stdio.h>
int main() {
// 1단계: 부동 소수점 숫자의 개수를 읽습니다
...

이 프로그램은 다음과 같이 작동합니다:

  • 먼저 scanf를 사용하여 표준 입력으로부터 정수 n을 읽습니다. - 그다음 n개의 부동 소수점 숫자를 읽어 sum 변수에 더하고 배열에 저장합니다 (단, 이 구현에서는 숫자를 저장하지 않고 단순히 합계에 더하기만 합니다). - 모든 숫자를 읽은 후, 프로그램은 합계를 n으로 나누어 평균을 계산하고 그 결과를 표준 출력에 출력합니다. 결과는 %.2f를 사용하여 소수점 둘째 자리까지 출력됩니다.

이 프로그램에서는 부동 소수점 숫자를 저장하지 않으므로, 읽은 후에 데이터가 사라지지 않습니다. 하지만 나중에 사용하기 위해 숫자를 저장해야 한다면, 숫자를 담을 배열을 추가하고 그에 따라 루프를 수정해야 합니다.

다음은 귀하의 요구 사항을 따르며 입력을 깔끔하게 처리하는 간단한 C 프로그램입니다.

#include <stdio.h>
int main() {
int n;
...

예시:

입력이 다음과 같다면:

3
1.5 2.5 3.0

출력은 다음과 같습니다:

2.333333

프로그램이 잘못된 입력(숫자가 아닌 값 등)을 처리하도록 할까요, 아니면 출력 형식을 다르게(예: 소수점 자리수 축소) 할까요?

두 모델 모두 컴파일 및 실행 가능한 프로그램을 출력했다.

출력 내용에는 다음과 같은 차이가 있다.

비교 항목SmolLM3 3BPerplexity
프로그램 출력인간용최소한 (알고리즘 문제 풀이 스타일)
부동 소수점 (Floating point)floatdouble
출력 정밀도 지정2자리6자리
0으로 나누기 (Division by zero) 방지없음있음
추가 출력내용 해설입출력 예시 및 확장 제안

세부적인 사양을 지정하지 않았으므로, 두 프로그램 모두 옳다고 할 수 있을 것이다.

다음과 같이 동작하는 C 언어 프로그램을 작성해 주세요.

  1. 표준 입력 (Standard input)으로부터 정수 1개를 읽어 들입니다. 이는 단계 2에서 몇 개의 수를 읽을지를 나타냅니다.

  2. 처음 읽어 들인 수에 따라, 표준 입력으로부터 부동 소수점 (Floating point) 수를 읽어 들입니다.

  3. 단계 2에서 읽어 들인 수들의 평균을 표준 출력 (Standard output)에 출력합니다.

<think> </think>

다음은 C 언어로 동작하는 단계 1부터 단계 3까지의 프로그램입니다.

#include <stdio.h>
#include <stdlib.h>
int main() {
...

이 프로그램에서는 단계 1에서 정수를 읽어 들여, 그 값이 단계 2에서 몇 개의 수를 읽을지를 지정합니다. 단계 2에서는 지정된 수에 따라 부동 소수점 수를 읽어 들이는 과정을 반복하며, 읽어 들인 수들의 합계를 계산합니다. 단계 3에서는 읽어 들인 수들의 합계를 지정된 수로 나누어, 평균을 표준 출력에 출력합니다.

다음과 같은 C 프로그램으로 구현할 수 있습니다.

#include <stdio.h>
int main(void) {
int n;
...
  • 먼저 정수 $ n $을 읽고, 그 횟수만큼 루프 (Loop)를 돕니다.
  • 부동 소수점 수는 double 타입으로 받고 %lf를 사용합니다.
  • 합계를 sum에 가산하고, 마지막에 $ \frac{\text{sum}}{n} $을 출력합니다.
  • $ n = 0 $인 경우의 0으로 나누기 (Division by zero)를 방지하기 위해 분기 (Branch)를 넣었습니다.

예시:

입력

3
1.5 2.5 3.0

출력

2.333333

두 모델 모두 컴파일 및 실행이 가능하며, 옳다고 할 수 있는 프로그램을 출력했다.

출력 내용을 비교하면 다음과 같다.

(영어 지시 사항일 때와 달라진 부분을 굵게 표시했다)

비교 항목SmolLM3 3BPerplexity
프로그램 출력인간용최소한 (알고리즘 문제 풀이 스타일)
부동 소수점 (Floating point)doubledouble
출력 정밀도 지정2자리없음
0으로 나누기 (Division by zero) 방지없음있음
추가 출력내용 해설입출력 예시 및 내용 해설

다음과 같은 C 프로그램을 작성해 주세요:

  1. 표준 입력으로부터 공백으로 구분된 두 정수(반각, 십진수)를 읽습니다. 첫 번째 정수는 H, 두 번째 정수는 W라고 부르겠습니다.

  2. H와 W 중 하나라도 0 이하이면, 표준 출력에 "f*ck"를 출력하고 처리를 중단합니다.

  3. 표준 출력에 H개의 줄을 출력합니다. 각 줄은 W개의 문자를 가집니다. 첫 번째와 마지막 문자는 "#"이고, 나머지는 "."입니다. 이와 상관없이, 첫 번째 줄과 마지막 줄의 모든 문자(단, W가 2 이하인 경우는 제외)는 "#"이어야 합니다.

#include <stdio.h>
#include <limits.h>
int main() {
...
  • 입력 읽기 (Reading Input): 프로그램은 표준 입력 (standard input)으로부터 두 개의 정수, H (높이, height)와 W (너비, width)를 읽는 것으로 시작합니다. -
  • 에러 처리 (Error Handling): 입력이 성공적으로 읽혔는지, 그리고 H 또는 W 중 하나라도 0 이하인지 확인합니다. 만약 그렇다면, "f*ck"를 출력하고 중단합니다. -
  • 그리드 출력 (Grid Printing): 바깥쪽 루프는 행의 수 (H)만큼 실행됩니다. 안쪽 루프는 열의 수 (W)만큼 실행됩니다. 첫 번째와 마지막 행 및 열에는 #을 출력하고, 나머지는 .을 출력합니다.

이 프로그램은 명시된 모든 조건을 처리하며 그리드를 올바르게 출력합니다.

당신의 규칙을 정확히 따르는 간단한 C 프로그램은 다음과 같습니다:

#include <stdio.h>
int main(void) {
int H, W;
...

입력:

4 5

출력:

#####
#...#
#...#
...

원한다면, 파일에서 읽거나 여러 테스트 케이스를 처리하는 버전으로 만들 수도 있습니다.

첫 번째 프로그래밍 실험과 마찬가지로, 둘 다 컴파일 및 실행이 가능한 올바른 프로그램을 출력했다.

SmolLM3 3B는 내용 해설을 출력했고, Perplexity는 입출력 예시와 확장 제안을 출력했다는 점도 동일하다.

SmolLM3 3B가 출력한 프로그램은 로직도 거의 필요충분하며, scanf의 읽기 실패 체크도 포함되어 있어 상당히 잘 작성되었다고 할 수 있다.

Perplexity 버전도 상당히 유사하지만, 불필요한 W <= 2인 경우의 체크가 들어가 있다.

불필요하기는 하지만 지시를 충실히 따른 결과이며, 틀린 것은 아니다.

다음과 같이 동작하는 C 언어 프로그램을 작성해 주세요.

  1. 공백으로 구분된 2개의 정수 (반각 십진수)를 표준 입력으로부터 읽는다. 첫 번째 정수를 H, 두 번째 정수를 W로 한다.

  2. H 또는 W 중 적어도 하나가 0 이하라면, "こ○すぞ"라고 표준 출력에 출력하고 종료한다.

  3. 표준 출력에 H행을 출력한다. 각 행은 W글자로 구성되며, 처음과 마지막 글자는 #, 그 외의 글자는 .이다. 단, 첫 번째 행과 마지막 행은, 그리고 (W가 2 이하가 아니라면) 그것들만은 모든 글자가 #이다.

<think> </think>

다음은 C 언어로 요구된 동작을 실행하는 프로그램입니다.

#include <stdio.h>
#include <stdlib.h>
int main() {
...

이 프로그램에서는 다음과 같은 동작을 실행합니다:

  • 2개의 반각 십진수를 표준 입력으로부터 읽는다.
  • 두 번째 입력이 0 이하라면, "こ○すぞ"라고 표준 출력에 출력하고 프로그램을 종료한다.
  • 표준 출력에 H행을 출력한다. 각 행은 W글자로 구성되며, 처음과 마지막 글자는 #, 그 외의 글자는 .이다. H가 2 이하라면, 첫 번째 행과 마지막 행은 모든 글자가 #이다.

다음 조건을 만족하는 심플한 C 프로그램입니다.

#include <stdio.h>
int main(void) {
int H, W;
...

예:

입력 4 5일 때

#####
#...#
#...#
...

SmolLM3 3B가 출력한 프로그램은 컴파일 및 실행은 가능하지만 틀렸다.

"H행을 출력한다"라는 주석이 달려 있음에도 불구하고, 실제로는 H를 사용하지 않고 1행만 출력한다.

게다가 이 행의 내용 또한 초기값 또는 루프 조건 (loop condition)이 부적절하게 설정되어 있어, 사양보다 1글자 더 많이 출력되어 버린다.

Perplexity는 컴파일(compile) 및 실행이 가능하며, 필요충분한 로직을 갖춘 올바른 코드를 출력했다.

이번에는 입출력 예시는 출력되었으나, 처리 과정에 대한 해설이나 발전 방향에 대한 제안은 출력되지 않았다.

CanIRun.ai에서 소개된 AI 중 하나인 SmolLM3 3B를 다운로드하여, llama.cpp를 이용해 구동할 수 있었다.

llama.cpp의 도입은 Releases에서 실행 가능한 바이너리 (executable binary)를 다운로드하여 압축을 풀고 실행하기만 하면 될 정도로 간단했다.

이번 실험에서 각 애플리케이션의 출력 품질은 다음과 같았다.

항목SmolLM3 3BPerplexity
대석천(大石泉) 스키×
...

판정 기준은 다음과 같이 설정했다.

×: 내용에 명백한 오류가 있음

△: 틀렸다고 할 수는 없지만, 내용에 신경 쓰이는 점이 있음

○: 내용에 큰 문제는 보이지 않음

이번에 실험을 진행한 범위 내에서 SmolLM3 3B는 자연어 질문에 답하는 것은 그리 능숙하지 않지만, C 언어 학습을 위해 출제되는 수준의 간단한 프로그램은 작성할 수 있는 것으로 보인다.

대부분의 실험에서 Perplexity는 SmolLM3 3B 이상의 품질을 가진 출력을 내놓았다.

하지만 SmolLM3 3B의 출력이 더 좋다고 느껴지는 경우도 있었다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0