1 điểm bởi GN⁺ 2023-12-15 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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
  • .llamafile dựa trên LLaVA xuất mô tả hình ảnh ra stdout chỉ với --image và 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ỗi ENAMETOOLONG
  • Tóm tắt URL được thực hiện bằng cách dùng links chuyể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 .llamafile dự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.llamafile cho 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

Tóm tắt hình ảnh: gọi LLaVA ra stdout

  • llava-v1.5-7b-q4.llamafile mặ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ới lemurs.jpg và 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
  • --grammar giớ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
  • One-liner tạo tên tệp dùng đồng thời --grammar 'root ::= [a-z]+ (" " [a-z]+)+'-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ỗi ENAMETOOLONG
  • 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
  • links là trình duyệt web dòng lệnh, trên MacOS thường có thể cài bằng brew 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
    • links v2.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
  • 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 500 giú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/completions bằng curl và 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-turbo làm giá trị model và gửi mảng message gồm system·user
  • Phản hồi ví dụ gồm message assistant giải thích khái niệm đệ quy bằng thơ, cùng mức sử dụng completion_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
  • 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 ResearcherDigital 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 0 là 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 -r xuấ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ép size byte từ src sang dst bằng vòng lặp for và 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

 
GN⁺ 2023-12-15
Ý 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-captionhttps://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

    • Trong 9 tháng qua, 70% trang đầu của Hacker News và Twitter toàn là đủ loại chuyện về LLM CLI
      Đâ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
    • Tôi dùng https://github.com/go-go-golems/geppetto khá nhiều trong công việc; nó có chế độ CLI và chế độ chat TUI
      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
    • Các liên kết hay đấy. Tôi đang dùng https://github.com/npiv/chatbladehttps://github.com/tbckr/sgpt, và hoàn toàn đồng ý rằng LLM+CLI là một tổ hợp hoàn hả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
    • Có vẻ sự hào hứng với workflow lấy CLI làm trung tâm đang dần giảm
      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/null trong one-liner
    Sau đó 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

    • Trong zsh, thêm sh trướ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
    • Đây là lỗi ZSH và đã được sửa vài tháng trước. Có vẻ bạn đang dùng ZSH cũ
    • Tôi đã định thử trên một máy Windows có RTX 4070, nhưng nghe có vẻ trong WSL thì GPU không được dùng
      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

    • Không biết câu trả lời cho câu hỏi đó, nhưng không biết bạn đã biết là có thể tải tệp thực thi llamafile-server độc lập về và dùng với bất kỳ mô hình gguf nào chưa
  • 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

    • Chức năng cốt lõi là tùy chọn --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 LLM
      Ngoà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
    • https://news.ycombinator.com/item?id=38464057
    • llamafile không dùng Docker. Nó chỉ là một tệp thực thi
      Tải llamafile về, chmod +x rồi chạy bằng ./run là được
      Tuy 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

    • llamafile về cơ bản gần với llama.cpp mà không cần tự build
      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ị

    • Mô hình được ánh xạ bộ nhớ từ đĩa, nên kernel xử lý việc đọc nó vào bộ nhớ
      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
    • Khác biệt giữa chạy main của llama.cpp và dùng server + yêu cầu HTTP POST là khá lớn, nhưng không đến mức đảo lộn thế giới
      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

    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"  
    
  • 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.llamafile trong git bash thì chết ngay với “Segmentation fault”, còn trong cmd thì không có đầu ra nào
    Cũ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

    • Không rõ bạn đã thử chạy trong cmd.exe hoặc PowerShell chưa
      Có thể truyền cờ --strace hoặc nếu được thì --ftrace để xem chuyện gì đang xảy ra
    • Trên Windows, cần đổi tên .llamafile đã tải về thành .exe
    • Trên Windows, cần đổi tên .llamafile thành .exe