1 คะแนน โดย GN⁺ 2023-12-15 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ใช้ llamafile โอเพนซอร์สที่พัฒนาร่วมกับ Mozilla เหมือนเป็นเครื่องมือเชลล์ เพื่อรัน LLM แบบโลคัลเป็นไฟล์สั่งงานเดี่ยว และจัดการงานภาพ·หน้าเว็บ·API·แชต·โค้ด·อีเมลด้วย Bash one-liner
  • .llamafile ที่อิง LLaVA สามารถส่งออก คำอธิบายภาพ ไปยัง standard output ได้ด้วยแค่ --image และพรอมป์ต์ โดยอาจต้องมีการเตรียมพร้อมตามระบบปฏิบัติการ เช่น Xcode, binfmt_misc, หรือส่วนขยาย .exe
  • เมื่อนำไปใส่ในงานอัตโนมัติ ควรบีบขอบเขตผลลัพธ์ด้วย ข้อจำกัดไวยากรณ์ BNF, --temp 0, และการจำกัดโทเค็นด้วย -n และสำหรับการสร้างชื่อไฟล์ สิ่งสำคัญคือหลีกเลี่ยงผลลัพธ์ที่คาดเดาไม่ได้และข้อผิดพลาด ENAMETOOLONG
  • การสรุป URL ใช้วิธีแปลง HTML เป็นข้อความด้วย links แล้ว pipe เข้า Mistral 7B llamafile โดยตัวอย่างลดหน้าเว็บ 3,774 คำให้เหลือสรุป 129 คำ
  • ทำได้ตั้งแต่ local API ที่เข้ากันได้กับ OpenAI, แชตบอตในเทอร์มินัล, การเติมโค้ดอัตโนมัติ ไปจนถึงการเขียนอีเมล แต่ LLM สำหรับงานเขียนโค้ดยังมีข้อจำกัดด้านคณิตศาสตร์และการตรวจสอบ จึงปลอดภัยกว่าหากมองเป็นเครื่องมือช่วยสำรวจหัวข้อที่ไม่คุ้นเคย

ใช้ llamafile เป็นเครื่องมือเชลล์สำหรับ LLM แบบโลคัล

  • llamafile คือโปรเจกต์โอเพนซอร์สที่ทำร่วมกับ Mozilla เพื่อให้รัน LLM ได้โดยตรงบนคอมพิวเตอร์ของผู้ใช้
  • โปรเจกต์นี้มี 8.3k stars บน GitHub, 1073 upvotes บน Hacker News และยังได้รับการนำเสนอโดย Hackaday
  • รีลีสที่ใช้อ้างอิงในตัวอย่างคือ 0.8.12 และบทความนี้แสดงให้เห็นว่าสามารถทำอะไรได้บ้างในเวอร์ชันนี้
  • เริ่มต้นโดยดาวน์โหลด .llamafile ที่พรีบิลด์ไว้จาก Hugging Face แล้วให้สิทธิ์รัน
    • โมเดลที่ใช้คือ llava-v1.5-7b-q4.llamafile สำหรับโมเดลมัลติโหมดด้านภาพ LLaVA
    • รันได้บน MacOS, Linux, Windows และ BSD
    • หากมีปัญหาให้ดูหัวข้อ Gotchas ใน README โดย MacOS อาจต้องมี Xcode, Linux อาจต้องมีอินเทอร์พรีเตอร์ binfmt_misc, และ Windows อาจต้องใช้ส่วนขยาย .exe

สรุปภาพ: เรียก LLaVA ให้ออกทาง standard output

  • llava-v1.5-7b-q4.llamafile ใช้ โมเดลภาพแบบมัลติโหมด เป็นค่าเริ่มต้น และพฤติกรรมนี้จะเปลี่ยนไปหากส่ง --mmproj ''
  • ส่งภาพผ่านแฟลก --image GRAPHIC ได้ โดยรองรับไฟล์ jpeg, png, tga, bmp, psd, gif, hdr, pic, pnm
  • ส่งคำถามในรูปแบบ --silent-prompt -p PROMPT และคำตอบจะออกทาง standard output
  • one-liner ตัวอย่างถาม What do you see? กับ lemurs.jpg และใช้ --temp 0 เพื่อให้ได้ผลลัพธ์แบบกำหนดตายตัว
  • การ offload ไปยัง GPU ต้องใช้ -ngl 999
  • แม้จะใช้คำสั่งสรุปภาพเดียวกัน เวลารันก็แตกต่างกันมากตามฮาร์ดแวร์
    • Mac Studio: 4 วินาที, ราคา $8,300, M2 Ultra, แบนด์วิดท์หน่วยความจำ 800 GB/s, 60 GPU cores
    • Windows PC: 10 วินาที, NVIDIA GeForce RTX 2080 Ti อายุ 4 ปี, ราคาบน 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
  • one-liner สำหรับสร้างชื่อไฟล์ใช้ --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 llamafile สามารถใช้สรุป URL แบบ HTML ได้โดยรับข้อความที่ pipe มาจากคำสั่ง links
  • links คือเว็บเบราว์เซอร์บรรทัดคำสั่ง และบน MacOS มักติดตั้งได้ด้วย brew install links
  • ยังมีไบนารี APE แบบพรีบิลด์ให้ใช้ในกรณีไม่มีตัวจัดการแพ็กเกจ
    • links v2.29, 7.7MB
    • สำหรับ AMD64+ARM64, Linux+Windows+FreeBSD+NetBSD+OpenBSD
  • one-liner สำหรับสรุป 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 ที่นำไปใช้ในสคริปต์ได้ง่าย
  • ข้อจำกัดสำคัญคือห้ามเกิน ขนาดคอนเท็กซ์ 32k โทเค็นของ Mistral v0.2
    • -width 500 ช่วยหลีกเลี่ยงการจัดย่อหน้าใหม่ จึงลดการขึ้นบรรทัดใหม่ที่ไม่จำเป็น
    • ใช้ sed 's/ */ /g' เพื่อลดช่องว่างซ้ำ
    • ใช้ dd bs=1 count=80000 ตัดหน้าเว็บยาว ๆ แบบหยาบ ๆ เป็นแนวป้องกันชั้นสุดท้ายได้

local API ที่เข้ากันได้กับ OpenAI

  • llamafile แบบ “server” ให้ endpoint ที่เข้ากันได้กับ OpenAI API บนเครื่องโลคัล
  • ตัวอย่างใช้ Mixtral 8x7B ซึ่งต้องการ GPU แรงพอสำหรับรันโมเดลขนาด 30 gibibyte
  • เซิร์ฟเวอร์รันด้วย mixtral-8x7b-instruct-v0.1.Q5_K_M-server.llamafile --nobrowser
  • จากเทอร์มินัลอีกหน้าต่างหนึ่ง ส่งคำขอด้วย curl ไปที่ http://localhost:8080/v1/chat/completions แล้วใช้ Python จัดรูป JSON ที่ตอบกลับให้อ่านง่าย
  • JSON ของคำขอใช้รูปแบบ OpenAI Chat Completions โดยใส่ค่า model เป็น gpt-3.5-turbo และส่งอาร์เรย์ข้อความ system·user
  • ตัวอย่างการตอบกลับมีข้อความ assistant ที่อธิบายแนวคิดเรื่องรีเคอร์ชันเป็นบทกวี พร้อมข้อมูลการใช้งานอย่าง completion_tokens, prompt_tokens, total_tokens

แชตบอตในเทอร์มินัล: พรอมป์ต์ Digital Athena

  • llamafile สามารถใช้งานเหมือนเครื่องมือบรรทัดคำสั่ง UNIX มาตรฐานได้ โดยดาวน์โหลดไบนารีบีบอัดจากหน้ารีลีสหรือบิลด์จากซอร์ส
    • มีลำดับ git clone, make -j8, sudo make install, man llamafile
  • วิธีนี้ทำให้ใช้งานร่วมกับ GGUF weights จาก Hugging Face ได้สะดวก
  • ตัวอย่างแชตบอตใช้โมเดล LLaMA ดั้งเดิมที่ Facebook เผยแพร่เพื่อการวิจัย
  • พรอมป์ต์ควรออกแบบให้โมเดลพูดด้วยน้ำเสียงเชิงวิชาการโดยไม่ทำให้มีบุคลิกแบบมนุษย์
    • ใช้ชื่อ Digital Athena ซึ่งมาจาก Athena เทพีกรีกแห่งปัญญาและความรู้
    • เริ่มต้นในรูปแบบบทสนทนาระหว่าง Researcher กับ Digital Athena
  • การรันแบบโต้ตอบใช้ตัวเลือกอย่าง --interactive, --color, --ctx_size 4096, --reverse-prompt 'Researcher:'
  • --temp 0 เป็นการตั้งค่าเพื่อให้ผลลัพธ์กำหนดตายตัวและทำซ้ำได้
    • ถ้าไม่ใช้ llamafile จะใช้ระดับความสุ่มของ 0.8.12 ทำให้ได้คำตอบไม่ซ้ำกันในแต่ละครั้ง
  • หากต้องการแชตบอตที่มีบุคลิกแบบมนุษย์มากขึ้น โมเดล LLaMA ดั้งเดิมอาจจัดการได้ยาก เพราะมีแนวโน้มพื้นฐานที่จะมองผู้ใช้เหมือนคนแปลกหน้าบน Reddit

เติมโค้ดอัตโนมัติ: ใช้ Wizard Coder

  • ดาวน์โหลด Wizard Coder llamafile แล้วนำไปใช้เติมบรรทัดปัจจุบันอัตโนมัติใน Emacs หรือ Vim ได้
  • โมเดลตัวอย่างถูก fine-tune มาเน้น Python แต่สร้าง implementation ของ memcpy() ในภาษา C ได้
  • พรอมป์ต์ใส่แค่จุดเริ่มต้นของ Markdown code block และ function signature โดยไม่ใส่คำอธิบายภาษาอังกฤษ
    • เมื่อไม่ใช้ภาษาอังกฤษ โอกาสที่โมเดลจะต่อคำอธิบายโค้ดยาว ๆ จะลดลง
    • การใช้ Markdown code block ช่วยเพิ่มโอกาสที่โทเค็น reverse prompt ที่กำหนดด้วย -r จะปรากฏและหยุดได้ในจังหวะเหมาะสม
    • ถ้าต้องการให้หยุดแน่ขึ้นอีก สามารถจำกัดคำตอบไว้ที่ 100 โทเค็นด้วย -n 100
  • ผลลัพธ์ตัวอย่างคือ implementation ของ memcpy() ที่ใช้ลูป for คัดลอกจาก src ไป dst ตาม size แล้วคืนค่า dst
  • LLM สำหรับงานเขียนโค้ดยังมีข้อจำกัดชัดเจน
    • เข้าใจภาษามนุษย์ได้ดี แต่ไม่เก่งคณิตศาสตร์
    • เขียนโค้ดที่ดูน่าเชื่อถือได้ แต่บ่อยครั้งไม่ผ่านการตรวจทานจริงจัง
    • มองมันเหมือนเครื่องมือที่ท่องคำตอบจาก Stack Overflow หลายภาษาได้จะช่วยให้เข้าใจบทบาทมากขึ้น
    • หากคาดหวังให้มันช่วยสำรวจหัวข้อที่ไม่คุ้นเคย จะมีโอกาสได้ประสบการณ์ที่ดีกว่า

เขียนอีเมล: สร้างคำตอบด้วยโมเดลขนาดเล็ก

  • ตัวอย่างการเขียนอีเมลเป็นสถานการณ์ที่ Raspberry Pi ราคา $50 ตอบอีเมลบริษัทเพื่อช่วยขายสินค้า
  • Rocket 3B ใช้ไวยากรณ์พรอมป์ต์ที่ต่างออกไปเล็กน้อย และในกรณีนี้ temperature อาจช่วยเลียนแบบความด้นสดได้
  • ตัวอย่างสมมติให้เซิร์ฟเวอร์ PHP ฉีดคำขอซัพพอร์ตเข้าไปในพรอมป์ต์ แล้ว pipe ผลลัพธ์เข้า sendmail
  • system prompt สั่งให้ช่วยผู้ใช้ แต่ในขณะเดียวกันก็นำบทสนทนาไปสู่การซื้อพิกเคิล
  • สำหรับตัวอย่างที่ผู้ใช้บอกว่าติดลมแรงใน Long Island Sound และต้องการความช่วยเหลือ โมเดลจะสร้างคำตอบที่เริ่มจากการแสดงความเห็นใจ ก่อนแนะนำ Bill Pickle’s Gourmet Dill Pickles
  • ตัวอย่างสุดท้ายมีเจตนาเป็นมุกตลก และไม่ควรตีความว่า Mozilla แนะนำหรือรับรองโมเดล, ไลเซนส์, ชุดข้อมูล หรือแนวปฏิบัติใดเป็นการเฉพาะ

1 ความคิดเห็น

 
GN⁺ 2023-12-15
ความคิดเห็นบน Hacker News
  • ผมสนุกกับการสำรวจ การผสาน LLM กับยูทิลิตี CLI มาหลายเดือนแล้ว และทั้งสองอย่างเข้ากันได้ดีมากจริง ๆ
    แนวทางแบบปรัชญา Unix ที่ใช้ pipe เชื่อมเครื่องมือต่าง ๆ เข้าด้วยกันก็เข้ากับวิธีการทำงานของ LLM ได้ดี
    ส่วนใหญ่ผมทดลองด้วยเครื่องมือ CLI https://llm.datasette.io/ และยังมีเครื่องมือใช้เฉพาะกิจอย่าง https://github.com/simonw/blip-caption และ https://github.com/simonw/ospeak ด้วย
    มันสนุกจนแปลกใจที่ยังไม่มีคนจำนวนมากมาสำรวจพื้นที่ LLM+CLI กันอย่างจริงจังมากกว่านี้

    • ตลอด 9 เดือนที่ผ่านมา หน้าแรกของ Hacker News และ Twitter ราว 70% เป็นเรื่อง LLM CLI สารพัดแบบ
      เป็นการสำรวจในสายเทคโนโลยีที่เสียงดังที่สุดเท่าที่เคยเห็นมา และถึงขั้นที่ไม่ต้องฟังเพิ่ม แต่ฟังให้น้อยลงก็น่าจะพอแล้ว
    • ในงานผมใช้ https://github.com/go-go-golems/geppetto ค่อนข้างมาก มีทั้งโหมด CLI และโหมดแชตแบบ TUI
      มันเผย prompt template ออกมาเหมือน verb บน command line และโหลดจาก “repository” หลายแห่งได้
      ผมดูแลชุด prompt สำหรับแต่ละ repository ที่กำลังทำงานอยู่ และวางสคริปต์ “prompto” แบบกำหนดเอง https://github.com/go-go-golems/prompto ไว้ด้วยเพื่อสร้างบริบท prompt แบบไดนามิก
      ผมทำไว้สำหรับไลบรารีภายนอกพอสมควรด้วย อยู่ที่ https://github.com/go-go-golems/promptos
      prompt สาธารณะบางส่วนดูได้ที่ https://github.com/go-go-golems/geppetto/tree/main/cmd/pinoc... และตอนนี้กำลังสร้าง เฟรมเวิร์กเอเจนต์เชิงประกาศ อยู่
    • ลิงก์ดีมาก ผมใช้ https://github.com/npiv/chatblade กับ https://github.com/tbckr/sgpt อยู่ และเห็นด้วยเต็มที่ว่า LLM+CLI เป็นคู่ที่เข้ากันอย่างสมบูรณ์แบบ
      เมื่อไม่นานมานี้ผมสร้าง knowledge base เฉพาะทางขนาด 278,000 token ด้วย httrack + w3m dump + sgpt images + GPT Vision และทำ RAG ด้วย Perl hack แบบกำหนดเองที่รักษาโครงสร้างภาพรวมของความรู้ไว้
      อยากรู้ว่ามีใครเคยเห็นเครื่องมือที่เข้ากับปรัชญา Unix ได้ดีสำหรับการประมวลผลอินพุตและ RAG แบบโลคัลไหม
      เพิ่มเติม: ดูเหมือนผู้เขียนต้นฉบับจะทำงานที่เกี่ยวข้องไว้ค่อนข้างเยอะแล้ว และสรุปไว้ที่ https://simonwillison.net/2023/Oct/23/embeddings/
      จุดที่ตอนนี้ติดอยู่คือ toolchain สำหรับ chunking เนื้อหาที่จะเอาไปสร้าง embedding อยากได้ตัวที่ทำอะไรฉลาด ๆ เช่น ตรวจจับบริบทตำแหน่งในต้นฉบับอย่าง “2.1 Failover” หรือ “Chapter 8: The dream”, คลายการตัดบรรทัดของซอร์สที่กว้าง 80 อักขระ และรักษาย่อหน้าไว้
    • ดูเหมือนความตื่นตัวต่อ workflow ที่เน้น CLI จะค่อย ๆ ลดลง
      ผมคิดว่าสาเหตุหลักคือ VS Code และนักพัฒนาที่ผมซัพพอร์ตก็ต้องการ point-and-click มากกว่า terminal กับ CLI
  • บทความที่เกี่ยวข้องล่าสุด
    Llamafile – The easiest way to run LLMs locally on your Mac - https://news.ycombinator.com/item?id=38522636 - ธันวาคม 2023, 17 ความคิดเห็น
    Llamafile is the new best way to run a LLM on your own computer - https://news.ycombinator.com/item?id=38489533 - ธันวาคม 2023, 47 ความคิดเห็น
    Llamafile lets you distribute and run LLMs with a single file - https://news.ycombinator.com/item?id=38464057 - พฤศจิกายน 2023, 287 ความคิดเห็น

  • เจ๋งมาก ตัวอย่างที่ใช้ LLM เปลี่ยนชื่อไฟล์รูปภาพให้เป็นชื่อเชิงบรรยาย ถูกใจเป็นพิเศษ

  • ผมลองรันบน NVIDIA GeForce RTX 3080 Ti ในเดสก์ท็อป Windows และเจออุปสรรคอยู่หลายอย่างกว่าจะทำให้ทำงานได้
    WSL แสดงข้อผิดพลาด error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop' ซึ่งถูกซ่อนไว้ด้วย /dev/null ใน one-liner
    จากนั้นใน zsh ก็ขึ้น zsh: exec format error: ./llava-v1.5-7b-q4-main.llamafile เลยต้องไปรันใน bash แม้ชื่อเรื่องจะบอกว่าเป็น bash แต่ก็ดูแปลกที่ใช้กับ zsh ไม่ได้
    มีคำเตือนว่าไม่รองรับ GPU offloading ด้วย ซึ่งน่าจะเป็นเพราะ WSL ผมไม่ได้ทำ GPU programming บนเครื่อง Windows นี้

    • ใน zsh แก้ได้ด้วยการเติม sh หน้า command: sh ./llava-v1.5-7b-q4-main.llamafile
      เป็นพฤติกรรมแปลก ๆ ของ zsh กับ APE และมีเนื้อหาเกี่ยวข้องที่ https://justine.lol/ape.html
    • นี่เป็น บั๊กของ ZSH และแก้ไปแล้วเมื่อไม่กี่เดือนก่อน ดูเหมือนคุณจะใช้ ZSH เวอร์ชันเก่าอยู่
    • ผมกำลังคิดจะลองบนเครื่อง Windows ที่มี RTX 4070 แต่ฟังดูเหมือนว่า WSL จะไม่ใช้ GPU
      อยากรู้ว่าตอนทดสอบด้วย CPU อย่างเดียวมันช้ามากไหม
  • ลองค้นหาอย่างรวดเร็วบน Hugging Face แล้วเห็น Llamafile ของ TinyLlama ระดับประมาณ 1B อยู่หลายตัว
    ถ้ารวมกับ llamafile 3 ตัวที่มีอยู่เดิมก็เป็นทั้งหมด 6 ตัว เลยสงสัยว่ายังมี llamafile อื่น ๆ ในโลกภายนอกอีกไหม

    • ผมไม่รู้คำตอบของคำถามนี้ แต่สงสัยว่ารู้ไหมว่าสามารถดาวน์โหลดไฟล์ปฏิบัติการ llamafile-server แบบสแตนด์อโลน แล้วใช้ร่วมกับโมเดล gguf ใด ๆ ก็ได้
  • สงสัยว่า HN มอง llamafile กับ modelfile(https://github.com/jmorganca/ollama/blob/main/docs/modelfile...) อย่างไร
    ทั้งสองอย่างทำให้นึกถึงประสบการณ์แบบ Dockerfile. Modelfile ดูเหมือน Dockerfile ทันที แต่ llamafile ดูเขียนยากกว่า และไม่เห็นภาพในทันทีว่ารูปร่างจริง ๆ เป็นแบบไหน เลยสงสัยว่าเป็นลำดับคำสั่งที่รันในเทอร์มินัลหรือเปล่า
    ในเชิงทฤษฎีก็สงสัยด้วยว่าทำไมไม่ใช้ Dockerfile ไปเลย

    • ฟีเจอร์หลักคือออปชัน --grammar และเหมาะมากกับสคริปต์ bash ที่จำกัด logits ของเอาต์พุต LLM เพื่อทำงานจัดประเภทด้านประมวลผลภาษาธรรมชาติสารพัดแบบ
      นอกเหนือจากนั้น ถ้าต้องใช้ LLM บนเครื่องก็ใช้ ollama, ถ้าเช่าเซิร์ฟเวอร์ GPU ก็ใช้ vllm และถ้าแค่อยากได้โมเดลที่ดีที่สุดก็ใช้ OpenAI API
    • https://news.ycombinator.com/item?id=38464057
    • llamafile ไม่ได้ใช้ Docker เป็นแค่ไฟล์ปฏิบัติการ
      ดาวน์โหลด llamafile มา แล้ว chmod +x จากนั้นรันด้วย ./run ก็พอ
      แต่การใช้ Docker + llamafile ร่วมกันก็ทำได้ มีการตั้งค่า Dockerfile ที่ค่อนข้างดีใน https://github.com/ajbouh/cosmos
  • สงสัยข้อดีข้อเสียของ llamafile ที่ใช้ในต้นฉบับกับ ollama

    • llamafile โดยพื้นฐานใกล้เคียงกับ llama.cpp ที่ไม่ต้องบิลด์เอง
      ดังนั้นจึงใช้ปุ่มปรับแต่งสารพัดอย่างได้ด้วยความพยายามน้อยที่สุด โดยเฉพาะถ้าดาวน์โหลด llamafile แบบ “server” ก็จะเป็นวิธีที่เร็วที่สุดในการเปิด LLM บนเครื่องในแท็บเบราว์เซอร์
      https://huggingface.co/jartine/llava-v1.5-7B-GGUF/tree/main
      llamafile ก็ทำแชตบอทบน command line ได้เหมือนกัน แต่สำหรับการใช้งานนั้น ollama ให้ประสบการณ์ที่สะอาดและขัดเกลากว่ามาก
  • อยากตรวจว่าผมเข้าใจถูกไหม ถ้าใช้ llamafile ในเชลล์สคริปต์เพื่อเปลี่ยนชื่อไฟล์ในไดเรกทอรี แบบนั้นทุกครั้งที่มีชื่อไฟล์ใหม่เข้ามา ก็ต้องเปิดและโหลดไฟล์ปฏิบัติการใหม่ใช่ไหม?
    ถ้าอย่างนั้นหน่วยความจำจะถูกโหลดและ unload ทุกครั้งหรือเปล่า หรือมีแคชเจ๋ง ๆ อะไรที่ผมไม่รู้จักไหม
    ตอนรันตัวอย่างคำบรรยายภาพครั้งแรกบน M1 Pro ใช้เวลา 13 วินาที ครั้งที่สอง 8 วินาที และการรันหลังจากนั้นก็ใช้เวลาใกล้เคียงกันตลอด
    ถ้าจะประมวลผลไฟล์จำนวนมาก ก็น่าจะต้องใช้วิธีที่ โหลด weights เพียงครั้งเดียว แล้วคงไว้ขณะที่โปรเซสทำงานวนลูปอยู่จริง ๆ
    ถึงอย่างนั้นก็ยังมีประโยชน์และน่าสนใจมาก

    • โมเดลถูก memory map จากดิสก์ ดังนั้นเคอร์เนลเป็นผู้จัดการการอ่านเข้าเมโมรี
      ตราบใดที่ไม่มีอย่างอื่นมาเรียกใช้ RAM นั้น หน้าเหล่านั้นจะยังคงถูกแคชไว้ในหน่วยความจำระหว่างการเรียกคำสั่ง
      บนเวิร์กสเตชัน 128GB แม้ใช้โมเดล 7B หลายตัวบน CPU ทั้งหมดก็ยังคงอยู่ในแคช
    • ความแตกต่างระหว่างการรัน main ของ llama.cpp กับการใช้ server + คำขอ POST HTTP ค่อนข้างมาก แต่ก็ไม่ได้พลิกโลก
      สำหรับการเติมข้อความไม่กี่บรรทัดบนโมเดล VRAM 8GB จะประมาณ 6 วินาทีเทียบกับ 2 วินาที และบน 3090 กับ RAM 96GB การอนุมานทั้งหมดรันบน GPU
      ถ้าทำ งานแบบ batch จริง ๆ การคงโมเดลไว้ระหว่างการ completion ย่อมดีกว่าแน่นอน
      ในทางกลับกันก็มีข้อเสียคือจะถูกผูกกับโมเดลที่โหลดไว้ใน 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"  
    
  • สงสัยว่าต้องทำอะไรบ้างเพื่อรัน llamafile บน Windows 10
    พอรัน 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