เทคนิค Bash one-liner สำหรับ LLM
(justine.lol)- ใช้ 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 16LLM อาจสร้างข้อความยาวเกินไปจนเกิดข้อผิดพลาด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 แบบพรีบิลด์ให้ใช้ในกรณีไม่มีตัวจัดการแพ็กเกจ
linksv2.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 ความคิดเห็น
ความคิดเห็นบน 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 กันอย่างจริงจังมากกว่านี้
เป็นการสำรวจในสายเทคโนโลยีที่เสียงดังที่สุดเท่าที่เคยเห็นมา และถึงขั้นที่ไม่ต้องฟังเพิ่ม แต่ฟังให้น้อยลงก็น่าจะพอแล้ว
มันเผย 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... และตอนนี้กำลังสร้าง เฟรมเวิร์กเอเจนต์เชิงประกาศ อยู่
เมื่อไม่นานมานี้ผมสร้าง 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 อักขระ และรักษาย่อหน้าไว้
ผมคิดว่าสาเหตุหลักคือ 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 นี้
shหน้า command:sh ./llava-v1.5-7b-q4-main.llamafileเป็นพฤติกรรมแปลก ๆ ของ zsh กับ APE และมีเนื้อหาเกี่ยวข้องที่ https://justine.lol/ape.html
อยากรู้ว่าตอนทดสอบด้วย CPU อย่างเดียวมันช้ามากไหม
ลองค้นหาอย่างรวดเร็วบน Hugging Face แล้วเห็น Llamafile ของ TinyLlama ระดับประมาณ 1B อยู่หลายตัว
ถ้ารวมกับ llamafile 3 ตัวที่มีอยู่เดิมก็เป็นทั้งหมด 6 ตัว เลยสงสัยว่ายังมี llamafile อื่น ๆ ในโลกภายนอกอีกไหม
สงสัยว่า 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
ดาวน์โหลด llamafile มา แล้ว
chmod +xจากนั้นรันด้วย./runก็พอแต่การใช้ Docker + llamafile ร่วมกันก็ทำได้ มีการตั้งค่า Dockerfile ที่ค่อนข้างดีใน https://github.com/ajbouh/cosmos
สงสัยข้อดีข้อเสียของ llamafile ที่ใช้ในต้นฉบับกับ ollama
ดังนั้นจึงใช้ปุ่มปรับแต่งสารพัดอย่างได้ด้วยความพยายามน้อยที่สุด โดยเฉพาะถ้าดาวน์โหลด 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 เพียงครั้งเดียว แล้วคงไว้ขณะที่โปรเซสทำงานวนลูปอยู่จริง ๆ
ถึงอย่างนั้นก็ยังมีประโยชน์และน่าสนใจมาก
ตราบใดที่ไม่มีอย่างอื่นมาเรียกใช้ RAM นั้น หน้าเหล่านั้นจะยังคงถูกแคชไว้ในหน่วยความจำระหว่างการเรียกคำสั่ง
บนเวิร์กสเตชัน 128GB แม้ใช้โมเดล 7B หลายตัวบน CPU ทั้งหมดก็ยังคงอยู่ในแคช
สำหรับการเติมข้อความไม่กี่บรรทัดบนโมเดล VRAM 8GB จะประมาณ 6 วินาทีเทียบกับ 2 วินาที และบน 3090 กับ RAM 96GB การอนุมานทั้งหมดรันบน GPU
ถ้าทำ งานแบบ batch จริง ๆ การคงโมเดลไว้ระหว่างการ completion ย่อมดีกว่าแน่นอน
ในทางกลับกันก็มีข้อเสียคือจะถูกผูกกับโมเดลที่โหลดไว้ใน server ถ้าโหลดเมื่อต้องใช้ทุกครั้ง ก็สลับโมเดลได้
เรื่องนี้สำคัญสำหรับการถามภาพแบบมัลติโมดัล เพราะโมเดลอื่น ๆ ไม่เข้าใจโทเคนภาพที่ถูกโปรเจกต์มา
ในขั้นตอนติดตั้งมีคำสั่งต่อไปนี้ เลยสงสัยว่า ปลอดภัยไหม
สงสัยว่าต้องทำอะไรบ้างเพื่อรัน 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เพื่อดูว่าเกิดอะไรขึ้นได้.llamafileที่ดาวน์โหลดมาเป็น.exe.llamafileเป็น.exe