1P by GN⁺ | ★ favorite | 댓글 1개
  • Mozilla와 함께 만든 오픈소스 llamafile을 셸 도구처럼 써서, 로컬 LLM을 단일 실행 파일로 실행하고 이미지·웹페이지·API·채팅·코드·이메일 작업을 Bash 원라이너로 처리함
  • LLaVA 기반 .llamafile--image와 프롬프트만으로 이미지 설명을 표준 출력에 내보내며, 운영체제별로 Xcode, binfmt_misc, .exe 접미사 같은 준비가 필요할 수 있음
  • 자동화에 넣을 때는 BNF 문법 제약, --temp 0, -n 토큰 제한으로 출력을 좁혀야 하며, 파일명 생성에서는 예측 불가능한 출력과 ENAMETOOLONG 오류를 피하는 것이 중요함
  • URL 요약은 links로 HTML을 텍스트화한 뒤 Mistral 7B llamafile에 파이프하는 방식이며, 예시에서는 3,774단어 웹페이지가 129단어 요약으로 줄어듦
  • OpenAI 호환 로컬 API, 터미널 챗봇, 코드 완성, 이메일 작성까지 가능하지만 코딩용 LLM은 수학과 검증에서 한계가 있어 낯선 주제를 탐색하는 보조 도구로 보는 편이 안전함

llamafile을 로컬 LLM 셸 도구로 쓰기

  • llamafile은 Mozilla와 함께 작업한 오픈소스 프로젝트로, LLM을 사용자의 컴퓨터에서 직접 실행하게 해줌
  • 프로젝트는 GitHub에서 8.3k stars, Hacker News에서 1073 upvotes를 얻었고 Hackaday 보도도 받음
  • 예제 기준 릴리스는 0.8.12이며, 글은 이 버전으로 가능한 작업을 보여줌
  • 시작은 Hugging Face에서 사전 빌드된 .llamafile을 내려받고 실행 권한을 주는 방식임
    • 사용 모델은 멀티모달 비전 모델 LLaVAllava-v1.5-7b-q4.llamafile
    • MacOS, Linux, Windows, BSD에서 실행 가능함
    • 문제가 있으면 README의 Gotchas를 확인해야 하며, MacOS는 Xcode, Linux는 binfmt_misc 인터프리터, Windows는 .exe 접미사가 필요할 수 있음

이미지 요약: LLaVA를 표준 출력으로 호출

  • llava-v1.5-7b-q4.llamafile은 기본적으로 멀티모달 비전 모델을 사용하며, --mmproj ''를 넘기면 이 동작이 달라짐
  • 이미지는 --image GRAPHIC 플래그로 전달하며 jpeg, png, tga, bmp, psd, gif, hdr, pic, pnm 파일을 받을 수 있음
  • 질문은 --silent-prompt -p PROMPT 형태로 넘기고, 답변은 표준 출력으로 나옴
  • 예제 원라이너는 lemurs.jpg에 대해 What do you see?를 묻고 --temp 0으로 결정적 출력을 사용함
  • GPU 오프로딩에는 -ngl 999가 필요함
  • 같은 이미지 요약 명령도 하드웨어에 따라 실행 시간이 크게 달라짐
    • Mac Studio: 4초, 가격 $8,300, M2 Ultra, 800 GB/s 메모리 대역폭, 60 GPU cores
    • Windows PC: 10초, 4년 된 NVIDIA GeForce RTX 2080 Ti, 당시 Amazon 가격 $500~$1,000
    • Hewlett Packard ProDesk 600 G5: 45초, $1,653, Intel Core i9-9900, 2667 MT/s 또는 19.8 GB/s 메모리 대역폭, GPU 없음
  • 예시 출력은 어미 여우원숭이가 새끼 세 마리 중 두 마리를 안고 있으며, 초록 환경 속에서 보호와 온기를 제공한다는 식의 설명임

안전한 파일명 생성: 문법 제약과 토큰 제한

  • LLaVA로 이미지 파일명을 만들 때 핵심 위험은 LLM 출력이 일반적으로 예측 불가능하다는 점임
  • --grammar는 Backus-Naur Form으로 출력 가능한 토큰을 제한함
    • 예: root ::= "yes" | "no"는 출력이 "yes\n" 또는 "no\n"만 되도록 강제함
    • 파일명 예제는 소문자 단어와 공백만 나오게 한 뒤 sed로 공백을 밑줄로 바꾸고 .jpg를 붙임
  • 파일명 생성 원라이너는 --grammar 'root ::= [a-z]+ (" " [a-z]+)+'-n 16을 함께 사용함
  • -n 16으로 최대 생성 토큰 수를 제한하지 않으면 LLM이 너무 긴 텍스트를 만들어 ENAMETOOLONG 오류가 날 수 있음
  • 문법은 모델이 원래 생성하려는 방식과 어느 정도 맞아야 함
    • LLaVA는 밑줄이 들어간 문장을 생성하도록 훈련되지 않아 BNF에 밑줄을 직접 넣으면 비일관적 출력이 나올 수 있음
    • 소문자 출력은 LLaVA의 범위 안에 있었음
    • JSON처럼 웹에서 많이 수집된 형식은 문법 제약으로 환각된 JSON의 구문 오류를 줄이는 가드레일이 될 수 있음
  • 더 완성된 형태로는 rename-pictures.sh 스크립트가 있으며, ~/Pictures를 대상으로 실행하는 예가 나옴

URL 요약: links와 Mistral 7B 조합

  • Mistral 7B instruct llamafilelinks 명령의 출력물을 파이프해 HTML URL 요약에 쓸 수 있음
  • links는 명령줄 웹 브라우저이며, MacOS에서는 보통 brew install links로 설치 가능함
  • 패키지 관리자가 없을 때 사용할 수 있는 사전 빌드 APE 바이너리도 제공됨
    • links v2.29, 7.7MB
    • AMD64+ARM64, Linux+Windows+FreeBSD+NetBSD+OpenBSD용
  • URL 요약 원라이너는 다음 흐름으로 동작함
    • [INST]Summarize the following text:를 먼저 출력
    • links -codepage utf-8 -force-html -width 500 -dump URL로 웹페이지를 텍스트화
    • sed 's/*/ /g'로 일부 문자를 정리
    • [/INST]를 붙인 뒤 Mistral llamafile에 -f /dev/stdin으로 전달
  • 예시 대상인 “Real Programmers Don’t Use Pascal” 페이지는 3,774단어에서 129단어 요약으로 줄어듦
  • 같은 방식으로 텍스트에 대한 임의 질문도 가능함
    • 예시에서는 글쓴이가 정신적으로 불안정해 보이는지 묻고, Mistral은 과장과 과장법이 있지만 1983년 풍자적 글이라는 점을 반영함
    • --grammar 'root ::= "yes" | "no"'를 쓰면 스크립트에서 쓰기 쉬운 YES/NO 형태로 제한할 수 있음
  • 중요한 제약은 Mistral v0.2의 32k 토큰 컨텍스트 크기를 넘기지 않는 것임
    • -width 500은 문단 재배치를 피하게 해 불필요한 줄바꿈을 줄임
    • sed 's/ */ /g'로 반복 공백을 줄일 수 있음
    • dd bs=1 count=80000으로 긴 웹페이지를 거칠게 잘라 마지막 방어선으로 쓸 수 있음

로컬 OpenAI 호환 API

  • “server” llamafile은 로컬에서 OpenAI API 호환 엔드포인트를 제공함
  • 예제는 Mixtral 8x7B를 사용하며, 30 gibibyte 모델을 실행할 수 있는 강한 GPU가 필요함
  • 서버는 mixtral-8x7b-instruct-v0.1.Q5_K_M-server.llamafile --nobrowser로 실행함
  • 별도 터미널에서 curlhttp://localhost:8080/v1/chat/completions에 요청을 보내고, Python으로 반환 JSON을 보기 좋게 출력함
  • 요청 JSON은 model 값으로 gpt-3.5-turbo를 넣고 system·user 메시지 배열을 보내는 OpenAI Chat Completions 형식을 따름
  • 예시 응답에는 재귀 개념을 시로 설명한 assistant 메시지와 completion_tokens, prompt_tokens, total_tokens 사용량이 포함됨

터미널 챗봇: Digital Athena 프롬프트

  • llamafile은 릴리스 페이지의 압축 바이너리를 받거나 소스에서 빌드해 표준 UNIX 명령줄 도구처럼 사용할 수 있음
    • git clone, make -j8, sudo make install, man llamafile 흐름이 제시됨
  • 이 방식은 Hugging Face의 GGUF weights와 함께 쓰기 쉽게 만듦
  • 챗봇 예제는 Facebook이 연구 목적으로 공개한 원래 LLaMA 모델을 사용함
  • 프롬프트는 모델을 의인화하지 않고 학술적 어조로 말하게 구성하는 것이 중요함
    • 이름은 지혜와 지식의 그리스 여신 Athena에서 따온 Digital Athena
    • ResearcherDigital Athena 간 대화 형식으로 시작함
  • 대화형 실행에는 --interactive, --color, --ctx_size 4096, --reverse-prompt 'Researcher:' 같은 옵션이 사용됨
  • --temp 0은 출력이 결정적이고 재현 가능하도록 만드는 설정임
    • 사용하지 않으면 llamafile은 0.8.12의 무작위성 수준을 사용해 매번 고유한 답변을 받게 됨
  • 의인화된 챗봇을 원하면 원래 LLaMA 모델이 사용자를 Reddit의 낯선 사람처럼 보는 기본 성향 때문에 다루기 까다로울 수 있음

코드 완성: Wizard Coder 사용

  • Wizard Coder llamafile을 내려받으면 Emacs나 Vim에서 현재 줄 자동완성에 쓸 수 있음
  • 예제 모델은 Python 중심으로 파인튜닝됐지만 C의 memcpy() 구현을 생성함
  • 프롬프트는 영어 설명 없이 Markdown 코드 블록 시작과 함수 시그니처만 넣음
    • 영어를 쓰지 않으면 모델이 코드 설명을 길게 붙일 가능성이 줄어듦
    • Markdown 코드 블록을 쓰면 -r로 지정한 reverse prompt 토큰이 나와 적절한 시점에 종료될 가능성이 커짐
    • 더 확실히 멈추게 하려면 -n 100으로 응답을 100토큰으로 제한할 수 있음
  • 예시 출력은 for 루프로 src에서 dstsize만큼 복사하고 dst를 반환하는 memcpy() 구현임
  • 코딩용 LLM에는 분명한 한계가 있음
    • 인간 언어 이해는 잘하지만 수학에는 약함
    • 그럴듯해 보이는 코드를 쓰지만 검토를 견디는 경우가 드물 수 있음
    • Stack Overflow 답변을 여러 언어로 되뇌는 도구처럼 생각하면 도움이 됨
    • 좋은 경험을 얻으려면 낯선 주제를 탐색하는 데 도움받는다는 기대가 필요함

이메일 작성: 작은 모델로 응답 생성

  • 이메일 작성 예제는 $50 Raspberry Pi가 회사 이메일에 응답해 제품 판매를 돕는 상황임
  • Rocket 3B는 약간 다른 프롬프트 문법을 사용하며, 이 경우 temperature가 즉흥성을 흉내 내는 데 도움이 될 수 있음
  • 예제는 PHP 서버가 지원 요청을 프롬프트에 주입하고 출력을 sendmail로 파이프하는 구성을 가정함
  • 시스템 프롬프트는 사용자를 도우면서도 대화를 피클 구매로 유도하라고 지시함
  • 사용자가 Long Island Sound에서 강풍을 만나 구조가 필요하다고 말하는 예시에 대해, 모델은 공감 문장 뒤에 Bill Pickle’s Gourmet Dill Pickles를 권하는 답변을 생성함
  • 마지막 예제는 유머 의도이며, Mozilla가 특정 모델·라이선스·데이터셋·관행을 추천하거나 보증하는 것으로 해석하면 안 됨

댓글과 토론

Hacker News 의견들
  • 몇 달째 LLM과 CLI 유틸리티의 결합을 즐겁게 탐색 중인데, 둘은 정말 잘 맞음
    Unix 철학의 파이프로 여러 도구를 이어 붙이는 방식이 LLM 작동 방식과도 잘 어울림
    주로 https://llm.datasette.io/ CLI 도구로 실험했고, https://github.com/simonw/blip-captionhttps://github.com/simonw/ospeak 같은 단발성 도구도 있음
    LLM+CLI 영역을 더 많은 사람이 크게 탐구하지 않는 게 의아할 정도로 재미있음

    • 지난 9개월 동안 Hacker News와 Twitter 첫 화면의 70%가 온갖 LLM CLI 얘기였음
      지금까지 본 기술 분야 탐색 중 가장 시끄러웠고, 더 많이 들을 게 아니라 오히려 덜 들어도 될 정도임
    • 업무에서 https://github.com/go-go-golems/geppetto를 많이 쓰고 있고, CLI 모드와 TUI 채팅 모드가 있음
      프롬프트 템플릿을 명령줄 동사처럼 노출하고, 여러 “저장소”에서 불러올 수 있음
      작업 중인 각 저장소마다 프롬프트 세트를 유지하며, 동적 프롬프트 문맥을 생성하는 커스텀 “prompto” https://github.com/go-go-golems/prompto 스크립트도 함께 둠
      서드파티 라이브러리용도 꽤 만들었고 https://github.com/go-go-golems/promptos에 있음
      공개 프롬프트 일부는 https://github.com/go-go-golems/geppetto/tree/main/cmd/pinoc...에서 볼 수 있으며, 지금은 선언형 에이전트 프레임워크를 만들고 있음
    • 좋은 링크들임. https://github.com/npiv/chatbladehttps://github.com/tbckr/sgpt를 쓰고 있었고, LLM+CLI가 완벽하게 맞는 조합이라는 데 전적으로 동의함
      최근에는 httrack + w3m dump + sgpt images + GPT 비전으로 27.8만 토큰 규모의 특정 지식 기반을 만들었고, 지식의 개요 구조를 보존하는 커스텀 Perl 해킹으로 RAG를 구성함
      입력 처리와 로컬 RAG에 Unix 철학과 잘 맞는 도구를 본 적이 있는지 궁금함
      덧붙여 보니 원글 작성자가 이미 관련 작업을 꽤 해뒀고 https://simonwillison.net/2023/Oct/23/embeddings/에 정리돼 있음
      지금 막히는 지점은 임베딩을 만들 콘텐츠를 청킹하는 도구 체인임. 원문에서 “2.1 Failover”나 “Chapter 8: The dream” 같은 위치 문맥을 감지하고, 80자 폭 소스의 줄바꿈을 풀고, 문단을 유지하는 똑똑한 분할 등을 해주면 좋겠음
    • CLI 중심 워크플로에 대한 열기가 점점 줄어드는 것처럼 보임
      주된 원인은 VS Code라고 생각하고, 내가 지원하는 개발자들도 터미널과 CLI보다 포인트 앤 클릭을 더 원함
  • 최근 관련 글들임
    Llamafile – The easiest way to run LLMs locally on your Mac - https://news.ycombinator.com/item?id=38522636 - 2023년 12월, 댓글 17개
    Llamafile is the new best way to run a LLM on your own computer - https://news.ycombinator.com/item?id=38489533 - 2023년 12월, 댓글 47개
    Llamafile lets you distribute and run LLMs with a single file - https://news.ycombinator.com/item?id=38464057 - 2023년 11월, 댓글 287개

  • 정말 멋짐. LLM으로 이미지 파일명을 설명적으로 바꾸는 예제가 특히 마음에 듦

  • Windows 데스크톱의 NVIDIA GeForce RTX 3080 Ti에서 돌려봤고, 작동시키기 전까지 몇 가지 걸림돌이 있었음
    WSL은 원라이너에서 /dev/null로 숨겨지는 error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop' 오류를 냄
    그다음 zsh에서는 zsh: exec format error: ./llava-v1.5-7b-q4-main.llamafile가 떠서 bash에서 실행해야 했음. 제목이 bash라고 되어 있긴 하지만 zsh에서 안 되는 건 이상해 보임
    GPU 오프로딩이 지원되지 않는다는 경고도 나오는데, 아마 WSL 때문일 듯함. 이 Windows 머신에서는 GPU 프로그래밍을 하지 않음

    • zsh에서는 명령 앞에 sh를 붙이면 해결됨: sh ./llava-v1.5-7b-q4-main.llamafile
      zsh와 APE의 특이한 동작이고 https://justine.lol/ape.html에 관련 내용이 있음
    • 이건 ZSH 버그였고 몇 달 전에 고쳐졌음. 오래된 ZSH를 쓰고 있는 듯함
    • RTX 4070이 있는 Windows 머신에서 시도해볼까 했는데, WSL에서는 GPU가 쓰이지 않는 것처럼 들림
      CPU만 썼을 때 테스트가 많이 느렸는지 궁금함
  • Hugging Face에서 빠르게 검색해보니 TinyLlama 약 1B급 Llamafile이 몇 개 보임
    원래 있던 3개의 llamafile에 더하면 총 6개인데, 야생에 다른 llamafile도 더 있는지 궁금함

    • 질문의 답은 모르지만, 독립 실행형 llamafile-server 실행 파일을 내려받아 아무 gguf 모델과 함께 쓸 수 있다는 건 알고 있었는지 궁금함
  • HN이 llamafile과 modelfile(https://github.com/jmorganca/ollama/blob/main/docs/modelfile...)을 어떻게 보는지 궁금함
    둘 다 Dockerfile 같은 경험을 떠올리게 함. Modelfile은 바로 Dockerfile처럼 보이지만, llamafile은 쓰기 더 어려워 보이고 실제 형태가 즉시 와닿지 않음. 터미널에서 실행하는 명령 시퀀스인지 궁금함
    이론적으로는 왜 그냥 Dockerfile을 쓰지 않는지도 궁금함

    • 핵심 기능은 --grammar 옵션이고, LLM 출력의 로짓을 제한해서 온갖 자연어 처리 분류 작업을 하는 bash 스크립트에 아주 좋음
      그 외에는 로컬 LLM이 필요하면 ollama를 쓰고, GPU 서버를 빌릴 때는 vllm을 쓰며, 그냥 최고의 모델이 필요하면 OpenAI API를 씀
    • https://news.ycombinator.com/item?id=38464057
    • llamafile은 Docker를 쓰지 않음. 그냥 실행 파일임
      llamafile을 내려받고 chmod +x 한 뒤 ./run으로 실행하면 됨
      다만 Docker + llamafile 조합도 가능함. https://github.com/ajbouh/cosmos에 꽤 괜찮은 Dockerfile 설정이 있음
  • 원글에서 쓰인 llamafile과 ollama의 장단점이 궁금함

    • llamafile은 기본적으로 직접 빌드할 필요가 없는 llama.cpp에 가까움
      그래서 최소한의 노력으로 온갖 설정 노브를 쓸 수 있음. 특히 “server” llamafile을 내려받으면 브라우저 탭에서 로컬 LLM을 띄우는 가장 빠른 방법이 됨
      https://huggingface.co/jartine/llava-v1.5-7B-GGUF/tree/main
      llamafile도 명령줄 챗봇을 할 수는 있지만, 그 용도로는 ollama가 훨씬 더 깔끔하고 다듬어진 경험을 제공함
  • 이해한 게 맞는지 확인하고 싶음. 셸 스크립트에서 llamafile을 실행해 디렉터리 안 파일명을 바꾸는 식으로 쓰면, 새 파일명이 넘어올 때마다 실행 파일을 열고 로드해야 하는 것 맞나?
    그러면 그 메모리가 매번 로드되고 언로드되는 건지, 아니면 내가 모르는 멋진 캐싱이 있는 건지 궁금함
    이미지 캡션 예제를 M1 Pro에서 처음 실행했을 때는 13초, 두 번째는 8초였고 이후 실행도 계속 비슷한 시간이 걸림
    파일을 아주 많이 처리한다면 가중치를 한 번만 로드하고 프로세스가 루프를 도는 동안 유지하는 방식이 정말 필요할 것 같음
    그래도 여전히 아주 유용하고 흥미로움

    • 모델은 디스크에서 메모리 매핑되므로 커널이 메모리로 읽어들이는 일을 처리함
      그 RAM을 다른 것이 요구하지 않는 한, 해당 페이지들은 명령 호출 사이에도 메모리에 캐시된 상태로 남음
      128GB 워크스테이션에서는 CPU로 여러 7B 모델을 써도 모두 캐시에 남아 있음
    • llama.cpp의 main을 실행하는 것과 server + POST HTTP 요청을 쓰는 것의 차이는 꽤 크지만 세상이 뒤집힐 정도는 아님
      8GB VRAM 모델에서 몇 줄 완성 기준 대략 6초 대 2초 정도이고, 3090과 96GB RAM에서 추론은 전부 GPU로 돌리고 있음
      정말 배치 작업을 한다면 완성 사이에 모델을 계속 유지하는 편이 확실히 좋음
      반면 server로 로드한 모델에 묶인다는 단점이 있음. 필요할 때마다 로드하면 모델을 바꿔 끼울 수 있음
      이는 멀티모달 이미지 질의에 중요함. 다른 모델들은 투영된 이미지 토큰을 이해하지 못하기 때문임
  • 설치 단계에 다음 명령이 있는데, 이게 안전한지 궁금함

    sudo wget -O /usr/bin/ape [https://cosmo.zip/pub/cosmos/bin/ape-$(uname](<https://cosmo.zip/pub/cosmos/bin/ape-$(uname>) -m).elf  
    sudo chmod +x /usr/bin/ape  
    sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"  
    sudo sh -c "echo ':APE-jart:M::jartsr::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"  
    
  • Windows 10에서 llamafile을 실행하려면 뭔가 해야 하는지 궁금함
    llava-v1.5-7b-q4-server.llamafile을 git bash에서 실행하면 “Segmentation fault”로 바로 죽고, cmd에서는 아무 출력도 없음
    llamafile과 모델을 따로 내려받아 llamafile.exe -m llava-v1.5-7b-Q4_K.gguf도 해봤지만 같은 문제가 남음
    비슷한 문제를 찾지 못했고, 내가 보기엔 백신 문제도 아닌 듯함

    • cmd.exe나 PowerShell에서 실행해봤는지 궁금함
      --strace 또는 가능하면 --ftrace 플래그를 넘겨서 어떤 일이 일어나는지 확인해볼 수 있음
    • Windows에서는 내려받은 .llamafile의 이름을 .exe로 바꿔야 함
    • Windows에서는 .llamafile.exe로 이름 변경해야 함