Kỹ thuật Bash one-liner cho LLM
(justine.lol)- Sử dụng llamafile, dự án mã nguồn mở được tạo cùng Mozilla, như một công cụ shell để chạy LLM cục bộ dưới dạng một tệp thực thi duy nhất, xử lý các tác vụ về hình ảnh, trang web, API, chat, code và email bằng Bash one-liner
.llamafiledựa trên LLaVA xuất mô tả hình ảnh ra stdout chỉ với--imagevà prompt; tùy hệ điều hành có thể cần chuẩn bị như Xcode,binfmt_misc, hoặc hậu tố.exe- Khi đưa vào tự động hóa, cần thu hẹp đầu ra bằng ràng buộc ngữ pháp BNF,
--temp 0, và giới hạn token-n; với việc tạo tên tệp, điều quan trọng là tránh đầu ra khó đoán và lỗiENAMETOOLONG - Tóm tắt URL được thực hiện bằng cách dùng
linkschuyển HTML thành văn bản rồi pipe vào Mistral 7B llamafile; trong ví dụ, một trang web 3.774 từ được rút xuống bản tóm tắt 129 từ - Có thể dùng API cục bộ tương thích OpenAI, chatbot trong terminal, hoàn thiện code và soạn email, nhưng LLM cho lập trình có hạn chế về toán học và kiểm chứng, nên an toàn hơn khi xem nó là công cụ hỗ trợ khám phá chủ đề chưa quen
Dùng llamafile làm công cụ shell LLM cục bộ
- llamafile là dự án mã nguồn mở được thực hiện cùng Mozilla, cho phép chạy LLM trực tiếp trên máy tính của người dùng
- Dự án đạt 8,3k stars trên GitHub, 1073 upvotes trên Hacker News, và cũng được Hackaday đưa tin
- Bản phát hành dùng trong các ví dụ là 0.8.12, và bài viết cho thấy những việc có thể làm với phiên bản này
- Bắt đầu bằng cách tải
.llamafiledựng sẵn từ Hugging Face và cấp quyền thực thi- Mô hình được dùng là
llava-v1.5-7b-q4.llamafilecho mô hình thị giác đa phương thức LLaVA - Có thể chạy trên MacOS, Linux, Windows, BSD
- Nếu gặp vấn đề, cần xem mục Gotchas trong README; MacOS có thể cần Xcode, Linux có thể cần trình thông dịch
binfmt_misc, Windows có thể cần hậu tố.exe
- Mô hình được dùng là
Tóm tắt hình ảnh: gọi LLaVA ra stdout
llava-v1.5-7b-q4.llamafilemặc định dùng mô hình thị giác đa phương thức, và hành vi này thay đổi nếu truyền--mmproj ''- Hình ảnh được truyền bằng cờ
--image GRAPHIC, hỗ trợ các tệp jpeg, png, tga, bmp, psd, gif, hdr, pic, pnm - Câu hỏi được truyền theo dạng
--silent-prompt -p PROMPT, và câu trả lời xuất ra stdout - One-liner ví dụ hỏi
What do you see?vớilemurs.jpgvà dùng--temp 0để có đầu ra xác định - Offload sang GPU cần
-ngl 999 - Cùng một lệnh tóm tắt hình ảnh nhưng thời gian chạy khác nhau đáng kể tùy phần cứng
- Mac Studio: 4 giây, giá $8.300, M2 Ultra, băng thông bộ nhớ 800 GB/s, 60 GPU cores
- Windows PC: 10 giây, NVIDIA GeForce RTX 2080 Ti 4 năm tuổi, giá trên Amazon khi đó $500~$1.000
- Hewlett Packard ProDesk 600 G5: 45 giây, $1.653, Intel Core i9-9900, băng thông bộ nhớ 2667 MT/s hoặc 19,8 GB/s, không có GPU
- Đầu ra ví dụ là mô tả kiểu một con vượn cáo mẹ đang ôm hai trong ba con non, cung cấp sự bảo vệ và hơi ấm trong môi trường xanh
Tạo tên tệp an toàn: ràng buộc ngữ pháp và giới hạn token
- Khi dùng LLaVA để tạo tên tệp hình ảnh, rủi ro cốt lõi là đầu ra của LLM nói chung khó dự đoán
--grammargiới hạn các token có thể xuất ra bằng Backus-Naur Form- Ví dụ:
root ::= "yes" | "no"buộc đầu ra chỉ có thể là"yes\n"hoặc"no\n" - Ví dụ tên tệp chỉ cho ra chữ thường và khoảng trắng, sau đó dùng
sedđổi khoảng trắng thành dấu gạch dưới và thêm.jpg
- Ví dụ:
- One-liner tạo tên tệp dùng đồng thời
--grammar 'root ::= [a-z]+ (" " [a-z]+)+'và-n 16 - Nếu không giới hạn số token sinh tối đa bằng
-n 16, LLM có thể tạo văn bản quá dài gây lỗiENAMETOOLONG - Ngữ pháp cần khớp ở mức nào đó với cách mô hình vốn định tạo đầu ra
- LLaVA không được huấn luyện để tạo câu có dấu gạch dưới, nên nếu đưa thẳng dấu gạch dưới vào BNF có thể cho đầu ra thiếu nhất quán
- Đầu ra chữ thường nằm trong phạm vi của LLaVA
- Các định dạng được thu thập nhiều từ web như JSON có thể trở thành guardrail giúp giảm lỗi cú pháp trong JSON bị hallucinate nhờ ràng buộc ngữ pháp
- Dạng hoàn chỉnh hơn là script
rename-pictures.sh, với ví dụ chạy trên~/Pictures
Tóm tắt URL: kết hợp links và Mistral 7B
- Mistral 7B instruct llamafile có thể dùng để tóm tắt URL HTML bằng cách pipe đầu ra của lệnh
links linkslà trình duyệt web dòng lệnh, trên MacOS thường có thể cài bằngbrew install links- Cũng có cung cấp binary APE dựng sẵn để dùng khi không có trình quản lý gói
linksv2.29, 7,7MB- Cho AMD64+ARM64, Linux+Windows+FreeBSD+NetBSD+OpenBSD
- One-liner tóm tắt URL hoạt động theo luồng sau
- In trước
[INST]Summarize the following text: - Chuyển trang web thành văn bản bằng
links -codepage utf-8 -force-html -width 500 -dump URL - Dọn một số ký tự bằng
sed 's/*/ /g' - Thêm
[/INST]rồi truyền vào Mistral llamafile bằng-f /dev/stdin
- In trước
- Trang “Real Programmers Don’t Use Pascal” trong ví dụ được rút từ 3.774 từ xuống bản tóm tắt 129 từ
- Cũng có thể đặt các câu hỏi tùy ý về văn bản theo cùng cách
- Trong ví dụ, tác giả hỏi liệu người viết có vẻ bất ổn về tinh thần không, và Mistral phản ánh rằng có sự phóng đại và lối nói cường điệu nhưng đây là bài viết châm biếm năm 1983
- Dùng
--grammar 'root ::= "yes" | "no"'có thể giới hạn thành dạng YES/NO dễ dùng trong script
- Ràng buộc quan trọng là không vượt quá kích thước ngữ cảnh 32k token của Mistral v0.2
-width 500giúp tránh bố trí lại đoạn văn, giảm các xuống dòng không cần thiết- Có thể giảm khoảng trắng lặp bằng
sed 's/ */ /g' - Có thể dùng
dd bs=1 count=80000để cắt thô các trang web dài như tuyến phòng thủ cuối cùng
API cục bộ tương thích OpenAI
- llamafile “server” cung cấp endpoint tương thích OpenAI API trên máy cục bộ
- Ví dụ dùng Mixtral 8x7B, cần GPU mạnh có thể chạy mô hình 30 gibibyte
- Chạy server bằng
mixtral-8x7b-instruct-v0.1.Q5_K_M-server.llamafile --nobrowser - Ở terminal riêng, gửi yêu cầu tới
http://localhost:8080/v1/chat/completionsbằngcurlvà dùng Python in JSON trả về cho dễ đọc - JSON yêu cầu tuân theo định dạng OpenAI Chat Completions, đặt
gpt-3.5-turbolàm giá trịmodelvà gửi mảng message gồm system·user - Phản hồi ví dụ gồm message
assistantgiải thích khái niệm đệ quy bằng thơ, cùng mức sử dụngcompletion_tokens,prompt_tokens,total_tokens
Chatbot trong terminal: prompt Digital Athena
- llamafile có thể được dùng như công cụ dòng lệnh UNIX tiêu chuẩn bằng cách tải binary nén từ trang phát hành hoặc build từ source
- Luồng được đưa ra gồm
git clone,make -j8,sudo make install,man llamafile
- Luồng được đưa ra gồm
- Cách này giúp dễ dùng cùng GGUF weights trên Hugging Face
- Ví dụ chatbot dùng mô hình LLaMA gốc do Facebook công bố cho mục đích nghiên cứu
- Điều quan trọng là cấu hình prompt để mô hình không nhân hóa chính nó và nói bằng giọng học thuật
- Tên Digital Athena lấy từ Athena, nữ thần trí tuệ và tri thức của Hy Lạp
- Bắt đầu bằng định dạng hội thoại giữa
ResearchervàDigital Athena
- Chạy tương tác dùng các tùy chọn như
--interactive,--color,--ctx_size 4096,--reverse-prompt 'Researcher:' --temp 0là thiết lập giúp đầu ra xác định và có thể tái lập- Nếu không dùng, llamafile sẽ sử dụng mức ngẫu nhiên của 0.8.12, khiến mỗi lần nhận được câu trả lời riêng
- Nếu muốn chatbot được nhân hóa, mô hình LLaMA gốc có thể khó xử lý vì xu hướng mặc định là xem người dùng như người lạ trên Reddit
Hoàn thiện code: dùng Wizard Coder
- Tải Wizard Coder llamafile về thì có thể dùng để tự động hoàn thiện dòng hiện tại trong Emacs hoặc Vim
- Mô hình ví dụ được fine-tune chủ yếu cho Python nhưng tạo được phần triển khai
memcpy()bằng C - Prompt chỉ đưa phần mở đầu khối code Markdown và chữ ký hàm, không có mô tả tiếng Anh
- Nếu không viết tiếng Anh, khả năng mô hình thêm giải thích dài về code sẽ giảm
- Dùng khối code Markdown làm tăng khả năng token reverse prompt được chỉ định bằng
-rxuất hiện và dừng đúng lúc - Để dừng chắc hơn, có thể giới hạn phản hồi ở 100 token bằng
-n 100
- Đầu ra ví dụ là triển khai
memcpy()sao chépsizebyte từsrcsangdstbằng vòng lặpforvà trả vềdst - LLM cho lập trình có những hạn chế rõ ràng
- Hiểu ngôn ngữ con người tốt nhưng yếu về toán học
- Viết code trông có vẻ hợp lý nhưng có thể hiếm khi chịu được kiểm tra kỹ
- Sẽ hữu ích nếu xem nó như công cụ lặp lại các câu trả lời Stack Overflow bằng nhiều ngôn ngữ
- Để có trải nghiệm tốt, cần kỳ vọng rằng nó giúp khám phá các chủ đề chưa quen
Soạn email: tạo phản hồi bằng mô hình nhỏ
- Ví dụ soạn email là tình huống một Raspberry Pi $50 phản hồi email công ty để hỗ trợ bán sản phẩm
- Rocket 3B dùng cú pháp prompt hơi khác, và trong trường hợp này temperature có thể giúp mô phỏng sự ứng biến
- Ví dụ giả định cấu hình trong đó server PHP chèn yêu cầu hỗ trợ vào prompt và pipe đầu ra sang
sendmail - System prompt chỉ dẫn vừa hỗ trợ người dùng vừa hướng cuộc trò chuyện sang việc mua dưa muối
- Với ví dụ người dùng nói họ gặp gió mạnh ở Long Island Sound và cần được cứu hộ, mô hình tạo phản hồi gồm câu đồng cảm rồi khuyên dùng Bill Pickle’s Gourmet Dill Pickles
- Ví dụ cuối cùng có ý hài hước, và không nên hiểu rằng Mozilla khuyến nghị hoặc bảo chứng cho một mô hình, giấy phép, bộ dữ liệu hay thực hành cụ thể nào
1 bình luận
Ý kiến trên Hacker News
Tôi đã vui vẻ khám phá sự kết hợp giữa LLM và các tiện ích CLI trong vài tháng qua, và hai thứ này thực sự rất hợp nhau
Cách triết lý Unix dùng pipe để nối nhiều công cụ lại với nhau cũng rất phù hợp với cách LLM hoạt động
Tôi chủ yếu thử nghiệm với công cụ CLI https://llm.datasette.io/, và cũng có các công cụ dùng một lần như https://github.com/simonw/blip-caption và https://github.com/simonw/ospeak
Lĩnh vực LLM+CLI thú vị đến mức tôi thấy lạ là chưa có nhiều người khám phá mạnh mẽ hơn
Đây là cuộc khám phá ồn ào nhất trong lĩnh vực công nghệ mà tôi từng thấy, đến mức không phải cần nghe thêm mà thậm chí nghe ít đi cũng được
Nó phơi bày các template prompt như các động từ dòng lệnh, và có thể nạp từ nhiều “kho” khác nhau
Tôi duy trì một bộ prompt cho từng repository đang làm việc, kèm theo các script “prompto” https://github.com/go-go-golems/prompto tùy chỉnh để tạo ngữ cảnh prompt động
Tôi cũng đã làm khá nhiều cho các thư viện bên thứ ba, nằm ở https://github.com/go-go-golems/promptos
Một số prompt công khai có thể xem tại https://github.com/go-go-golems/geppetto/tree/main/cmd/pinoc..., và hiện tôi đang xây dựng một framework agent khai báo
Gần đây tôi đã tạo một cơ sở tri thức chuyên biệt cỡ 278 nghìn token bằng httrack + w3m dump + sgpt images + GPT vision, rồi dựng RAG bằng một bản hack Perl tùy chỉnh để bảo toàn cấu trúc khái quát của tri thức
Tôi tò mò liệu bạn có từng thấy công cụ nào hợp với triết lý Unix cho xử lý đầu vào và RAG cục bộ chưa
Nhân tiện, hóa ra tác giả bài gốc đã làm khá nhiều việc liên quan và tổng hợp ở https://simonwillison.net/2023/Oct/23/embeddings/
Điểm tôi đang mắc hiện tại là toolchain để chunking nội dung dùng tạo embedding. Sẽ rất tốt nếu nó phát hiện được ngữ cảnh vị trí trong văn bản gốc như “2.1 Failover” hay “Chapter 8: The dream”, bỏ ngắt dòng của nguồn có độ rộng 80 ký tự, giữ nguyên các đoạn văn, và tách một cách thông minh
Tôi nghĩ nguyên nhân chính là VS Code, và các developer mà tôi hỗ trợ cũng muốn point-and-click hơn là terminal và CLI
Đây là các bài liên quan gần đây
Llamafile – The easiest way to run LLMs locally on your Mac - https://news.ycombinator.com/item?id=38522636 - tháng 12/2023, 17 bình luận
Llamafile is the new best way to run a LLM on your own computer - https://news.ycombinator.com/item?id=38489533 - tháng 12/2023, 47 bình luận
Llamafile lets you distribute and run LLMs with a single file - https://news.ycombinator.com/item?id=38464057 - tháng 11/2023, 287 bình luận
Thực sự rất tuyệt. Tôi đặc biệt thích ví dụ dùng LLM để đổi tên file ảnh thành tên mang tính mô tả
Tôi đã chạy thử trên desktop Windows dùng NVIDIA GeForce RTX 3080 Ti, và gặp vài vướng mắc trước khi làm cho nó chạy được
WSL báo lỗi
error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop', vốn bị ẩn vào/dev/nulltrong one-linerSau đó trong zsh lại hiện
zsh: exec format error: ./llava-v1.5-7b-q4-main.llamafile, nên phải chạy bằng bash. Tiêu đề đúng là nói bash, nhưng việc không chạy được trong zsh trông vẫn hơi lạCũng có cảnh báo rằng GPU offloading không được hỗ trợ, có lẽ là do WSL. Tôi không lập trình GPU trên máy Windows này
shtrước lệnh là giải quyết được:sh ./llava-v1.5-7b-q4-main.llamafileĐây là hành vi đặc thù của zsh và APE, có nội dung liên quan tại https://justine.lol/ape.html
Tôi tò mò khi chỉ dùng CPU thì bài test có chậm lắm không
Tìm nhanh trên Hugging Face thì thấy có vài Llamafile TinyLlama cỡ khoảng 1B
Cộng thêm 3 llamafile đã có sẵn thì tổng cộng là 6, nhưng không rõ ngoài kia còn llamafile nào khác nữa không
Tò mò HN nhìn nhận llamafile và modelfile(https://github.com/jmorganca/ollama/blob/main/docs/modelfile...) như thế nào
Cả hai đều gợi nhớ đến trải nghiệm kiểu Dockerfile. Modelfile trông đúng như Dockerfile, nhưng llamafile có vẻ khó viết hơn và hình dạng thực tế của nó không hiện ra ngay. Không rõ nó có phải là một chuỗi lệnh chạy trong terminal không
Về mặt lý thuyết cũng thắc mắc vì sao không dùng luôn Dockerfile
--grammar, rất hợp cho các script bash làm đủ loại tác vụ phân loại xử lý ngôn ngữ tự nhiên bằng cách giới hạn logit của đầu ra LLMNgoài ra, nếu cần LLM cục bộ thì dùng ollama, khi thuê máy chủ GPU thì dùng vllm, còn nếu chỉ cần mô hình tốt nhất thì dùng OpenAI API
Tải llamafile về,
chmod +xrồi chạy bằng./runlà đượcTuy vậy cũng có thể kết hợp Docker + llamafile. Có cấu hình Dockerfile khá ổn ở https://github.com/ajbouh/cosmos
Tò mò về ưu và nhược điểm của llamafile được dùng trong bài gốc so với ollama
Vì vậy có thể dùng đủ loại nút chỉnh cấu hình với nỗ lực tối thiểu. Đặc biệt, nếu tải llamafile “server” về thì đó là cách nhanh nhất để chạy LLM cục bộ trong một tab trình duyệt
https://huggingface.co/jartine/llava-v1.5-7B-GGUF/tree/main
llamafile cũng có thể làm chatbot dòng lệnh, nhưng cho mục đích đó thì ollama mang lại trải nghiệm gọn gàng và hoàn thiện hơn nhiều
Muốn kiểm tra xem mình hiểu có đúng không. Nếu chạy llamafile trong shell script để đổi tên các tệp trong thư mục chẳng hạn, thì mỗi khi có tên tệp mới được đưa vào, nó phải mở và nạp tệp thực thi lại đúng không?
Vậy bộ nhớ đó có được nạp rồi dỡ ra mỗi lần không, hay có cơ chế cache hay ho nào mà tôi chưa biết?
Ví dụ tạo chú thích ảnh chạy lần đầu trên M1 Pro mất 13 giây, lần thứ hai 8 giây, và các lần sau vẫn mất khoảng thời gian tương tự
Nếu xử lý rất nhiều tệp thì có vẻ thật sự cần cách chỉ nạp trọng số một lần và giữ chúng trong khi tiến trình chạy vòng lặp
Dù vậy vẫn rất hữu ích và thú vị
Miễn là không có thứ khác cần phần RAM đó, các trang tương ứng vẫn được cache trong bộ nhớ giữa các lần gọi lệnh
Trên workstation 128GB, dù dùng nhiều mô hình 7B bằng CPU thì tất cả vẫn nằm trong cache
Với mô hình 8GB VRAM, khi hoàn thành vài dòng thì đại khái là 6 giây so với 2 giây, trên 3090 và RAM 96GB thì suy luận đều chạy hoàn toàn trên GPU
Nếu thật sự làm batch job thì rõ ràng nên giữ mô hình tồn tại giữa các lần hoàn thành
Ngược lại, nhược điểm là bị buộc vào mô hình đã nạp bằng server. Nếu nạp mỗi khi cần thì có thể thay mô hình
Điều này quan trọng với truy vấn ảnh đa phương thức, vì các mô hình khác không hiểu các token ảnh đã được chiếu
Trong bước cài đặt có các lệnh sau, không rõ chúng có an toàn không
Không rõ có cần làm gì để chạy llamafile trên Windows 10 không
Chạy
llava-v1.5-7b-q4-server.llamafiletrong git bash thì chết ngay với “Segmentation fault”, còn trong cmd thì không có đầu ra nàoCũng đã thử tải riêng llamafile và mô hình rồi chạy
llamafile.exe -m llava-v1.5-7b-Q4_K.gguf, nhưng vẫn gặp cùng vấn đềKhông tìm được vấn đề tương tự, và theo tôi thì có vẻ không phải do phần mềm diệt virus
cmd.exehoặc PowerShell chưaCó thể truyền cờ
--stracehoặc nếu được thì--ftraceđể xem chuyện gì đang xảy ra.llamafileđã tải về thành.exe.llamafilethành.exe