
บางครั้งโมเดลขนาดเล็กก็เพียงพอแล้ว และคุณไม่จำเป็นต้องใช้ GPU เสมอไป มีเหตุผลหลายประการที่ควรรันงานประเภท “เครื่องมือ” บน CPU โดยตรง: บางครั้งคุณก็ไม่มี GPU หรือคุณต้องการให้ข้อมูลคงอยู่ภายในเครื่อง หรือคุณแค่ต้องการให้โครงสร้างเรียบง่าย
นี่คือจุดที่ ONNX Runtime GenAI เข้ามามีบทบาท มันช่วยให้คุณรันโมเดลได้ทุกที่ที่ต้องการ: ใช้ GPU ถ้ามี หรือรันบน CPU ถ้าไม่มี และไม่ต้องเปลี่ยนโค้ดแม้แต่บรรทัดเดียว บทความนี้จะแสดงให้เห็นว่ามันทำงานอย่างไร โค้ดตัวอย่างทั้งหมดอยู่ในที่เก็บ onnx-inference
เริ่มต้นจากที่ไหน: โมเดล ML ที่พกพาได้
ทุกอย่างเริ่มต้นในเดือนกันยายน 2017 ผู้นำในอุตสาหกรรมตระหนักว่าความแตกแยกของเครื่องมือ ML กำลังสร้างความเสียหายให้กับทุกฝ่าย จึงได้เปิดตัว ONNX เป็นมาตรฐานร่วม ข้อเสนอของมันเรียบง่าย: ให้ “ตัวแปลสากล” สำหรับโมเดล คุณสามารถฝึกฝนในเฟรมเวิร์กที่คุณชอบ ส่งออกเป็นมาตรฐานสากล แล้วรันโมเดลนั้นอย่างมีประสิทธิภาพบนฮาร์ดแวร์เป้าหมายที่หลากหลาย
อุตสาหกรรมตอบสนองอย่างรวดเร็ว ภายในสิ้นปีนั้น มีบริษัทเข้าร่วมมากขึ้น ในปี 2018 Microsoft ได้เปิดตัว ONNX Runtime เป็นโอเพ่นซอร์ส ซึ่งเป็นเครื่องยนต์ที่ออกแบบมาเพื่อ “รัน” โมเดลเหล่านี้อย่างมีประสิทธิภาพบนฮาร์ดแวร์ใดๆ ในปี 2019 มันได้รับการอัปเกรดเป็นโครงการ Linux Foundation AI ซึ่งยืนยันสถานะของมันในฐานะมาตรฐานเปิด
มุ่งหน้าไปทางไหน: LLM ที่พกพาได้
เมื่อ LLM ระเบิดขึ้นประมาณปี 2023 ONNX ก็เผชิญกับความท้าทายใหม่ โมเดลดั้งเดิมนั้นไม่มีสถานะ: อินพุตเข้าไป ทำนายเอาต์พุตออกมา แต่ LLM นั้นแตกต่างออกไป — พวกมัน “พูดคุย” มีความจำ สร้างข้อความทีละโทเค็น และต้องการการจัดการ “KV cache” เพื่อจดจำบริบทการสนทนา
ONNX runtimes มาตรฐานไม่ได้ถูกสร้างมาสำหรับการวนซ้ำแบบนี้
ดังนั้นในปี 2024 ชุมชนจึงได้ปล่อย onnxruntime-genai ออกมา มันห่อหุ้มตรรกะเฉพาะที่ LLM ต้องการไว้รอบๆ runtime หลัก: การแปลงเป็นโทเค็น, การวนซ้ำการสร้าง, กลยุทธ์การค้นหา เช่น beam search และการจัดการสถานะ
ก้าวไปข้างหน้าถึงปี 2026 ตอนนี้เรามีคลังโมเดล ONNX ที่ถูกควอนไทซ์ล่วงหน้าบน Hugging Face แล้ว คุณสามารถนำไปใช้ได้ทันทีโดยไม่ต้องฝึกฝนหรือแปลงรูปแบบ
การใช้คลังนี้
ประโยชน์ของ onnxruntime-genai คือมันจัดการตรรกะการสร้างให้คุณ หากใช้ ONNX Runtime ดั้งเดิม คุณต้องเขียนลูปด้วยตัวเองเพื่อป้อนโทเค็นเอาต์พุตกลับไปเป็นอินพุต
ตอนนี้ดูเหมือนจะเป็นแบบนี้:
python
import onnxruntime_genai as og
โหลดโมเดล (เส้นทางนี้ใช้งานได้กับ CPU, GPU หรือมือถือโดยอัตโนมัติ)
model = og.Model(‘path/to/model’)
tokenizer = og.Tokenizer(model)
กำหนดค่าว่าคุณต้องการค้นหาอย่างไร
params = og.GeneratorParams(model)
params.set_search_options(max_length=256, batch_size=1)
ลูปการสร้าง
generator = og.Generator(model, params)
generator.append_tokens(tokenizer.encode(prompt))
while True:
generator.generate_next_token()
if generator.is_done():
break
# ถอดรหัสและพิมพ์ไปเรื่อยๆ
token = generator.get_next_tokens()[0]
print(tokenizer.decode(token), end='', flush=True)
มันทำงานหนักมากเบื้องหลัง: จัดการ KV cache, ใช้กลยุทธ์การค้นหาของคุณ (greedy, top-p ฯลฯ) และกำหนดเส้นทางโอเปอเรเตอร์ไปยังฮาร์ดแวร์ที่ดีที่สุดที่มี (CUDA, CoreML หรือ CPU)
ฮาร์ดแวร์ โมเดล และการควอนไทเซชัน
ตั้งแต่ยุคแรกๆ ของ LLM มีหลายอย่างที่เปลี่ยนแปลงไป โปรเซสเซอร์เร็วขึ้น โมเดลมีความสามารถที่น่าประหลาดใจแม้จะมีขนาดเล็กลง
และยังมีเรื่อง “การควอนไทเซชัน” เราไม่จำกัดอยู่แค่การรันโมเดลด้วยความแม่นยำ 32 บิตเต็มอีกต่อไป เทคนิคเช่น INT4 quantization สามารถบีบอัดน้ำหนักได้อย่างมาก โดยมีผลกระทบต่อความแม่นยำน้อยกว่าที่คาดไว้อย่างน่าประหลาดใจ
ฉันได้ทดสอบโมเดลหลายตัวด้วย onnx-inference สิ่งที่ควรทราบคือ โมเดลเล็กๆ เหล่านี้เข้าใจโครงสร้างได้ดี แต่ไม่เหมาะสำหรับงานที่ต้องใช้ความรู้เข้มข้น
สำหรับงานที่ง่ายมาก คุณสามารถใช้โมเดลเล็กๆ เช่น SmolLM2–135M ได้ เหมาะสำหรับการเติมข้อความพื้นฐานหรือการจำแนกประเภท
สำหรับงานที่ซับซ้อนมากขึ้น คุณจะต้องการโมเดลที่ใหญ่กว่า Qwen 3–0.6B มีความสามารถเพิ่มขึ้นอย่างมากโดยมีพารามิเตอร์เพิ่มขึ้นเพียงไม่กี่ร้อยล้าน
เมื่อคุณพิจารณาโมเดลที่มีพารามิเตอร์เกิน 500 ล้านบน CPU คุณต้องชั่งน้ำหนักอย่างรอบคอบระหว่างหน้าต่างบริบทที่ยอมรับได้ จำนวนโทเค็นสูงสุดที่จะสร้าง และความล่าช้า
การสร้างเซิร์ฟเวอร์ที่พกพาได้
การห่อหุ้มตรรกะการอนุมานลงในเซิร์ฟเวอร์น้ำหนักเบาสามารถทำให้มันใช้งานได้ทั่วไป ไม่ว่าผู้เรียกจะใช้ภาษาอะไรก็สามารถเข้าถึงได้ง่าย รหัสในที่เก็บของฉันมีเซิร์ฟเวอร์ FastAPI ที่ทำสิ่งนี้
คลาสหลักคือ OnnxTextGenerator ซึ่งจัดการตรรกะการอนุมาน:
python
from inference import OnnxTextGenerator
ตรวจจับฮาร์ดแวร์อัตโนมัติ
generator = OnnxTextGenerator()
การรันแบบง่าย
result = generator.generate(
prompt=”Explain quantum computing like I’m five:”,
max_new_tokens=100,
temperature=0.7
)
print(result[‘generated_text’])
สำหรับแอปพลิเคชันแบบเรียลไทม์ คุณไม่สามารถรอคำตอบเต็มกลับมาได้ คุณสามารถใช้การสร้างแบบสตรีมแทน:
python
for chunk, metadata in generator.stream_generate(
prompt="Write a haiku about Docker:",
max_new_tokens=50,
temperature=0.8
):
print(chunk, end='', flush=True)
แต่ละฟังก์ชันจะถูกเปิดเผยเป็น FastAPI endpoint:
python
@app.post("/generate")
async def generate(request: GenerateRequest):
result = generator.generate(
prompt=request.prompt,
max_new_tokens=request.max_new_tokens,
temperature=request.temperature
)
return {
"generated_text": result["generated_text"],
"tokens_generated": result["tokens_generated"],
"finish_reason": result["finish_reason"]
}
ตัวเริ่มต้นจะค้นหา execution provider ฮาร์ดแวร์ที่ดีที่สุดโดยอัตโนมัติ เพื่อให้ “ใช้งานได้ทันที”: CUDA (NVIDIA GPU) → CoreML (Apple Silicon) → CPU (ทางเลือกสำรองทั่วไป)
กลยุทธ์การคอนเทนเนอร์ไรซ์
สำหรับโมเดลเล็กๆ แบบนี้ วิธีที่สะดวกคือการ “อบโมเดลลงในอิมเมจโดยตรง” วิธีนี้ทำให้พร้อมใช้งานหลังการปรับใช้โดยไม่ต้องรอการดาวน์โหลด
นี่คือ Dockerfile แบบย่อ:
dockerfile
FROM python:3.12-slim
COPY requirements.txt .
RUN pip install -r requirements.txt
ARG MODEL_ID=onnx-community/SmolLM2-135M-Instruct-ONNX
RUN hf download ${MODEL_ID} –local-dir /app/model
COPY . /app
WORKDIR /app
CMD [“uvicorn”, “app:app”, “–host”, “0.0.0.0”, “–port”, “8080”]
เมื่อโหลดคอนเทนเนอร์นี้ โมเดลจะอยู่บนดิสก์แล้ว สามารถเริ่มต้นได้ทันที และทำงานได้แม้ในสภาพแวดล้อมที่ไม่มีเครือข่าย
การทำให้เป็นแบบไม่มีเซิร์ฟเวอร์บน Google Cloud Run
Cloud Run เหมาะอย่างยิ่งสำหรับการปรับใช้แอปพลิเคชันที่ใช้โมเดลขนาดเล็ก มันสามารถปรับขนาดลงเป็นศูนย์เมื่อไม่ได้ใช้งาน ทำให้ไม่ต้องจ่ายสำหรับทรัพยากรที่ไม่ได้ใช้ เนื่องจากใช้ CPU จึงไม่จำเป็นต้องเตรียมอินสแตนซ์ GPU
ปรับใช้จากซอร์สโค้ด
สามารถปรับใช้จากซอร์สโค้ดได้โดยตรง คำสั่งต่อไปนี้ใช้ Google Cloud Build เพื่อสร้างคอนเทนเนอร์ และปรับใช้ไปยัง Cloud Run ในขั้นตอนเดียว
เราตั้งค่าพารามิเตอร์เฉพาะบางอย่างที่นี่: จัดสรร CPU 2 ตัว (การอนุมานเป็นงานที่ใช้การคำนวณหนัก) และหน่วยความจำ 4Gi (เพียงพอสำหรับโมเดลขนาดเล็กและ KV cache ของมัน) และตั้งค่าความพร้อมใช้งานพร้อมกันเป็น 4 เพื่อให้อินสแตนซ์สามารถจัดการคำขอพร้อมกันจำนวนเล็กน้อยได้โดยไม่ทำให้แคชสั่นสะเทือนอย่างรุนแรง
bash
gcloud run deploy onnx-inference
--allow-unauthenticated
--concurrency 4
--cpu 2
--labels dev-tutorial=onnx-inference
--memory 4Gi
--region us-central1
--source .
การทดสอบ
หลังจากปรับใช้เสร็จ ให้รับ URL ของบริการใหม่ และทดสอบด้วยคำสั่ง curl ง่ายๆ
bash
SERVICE_URL=$(gcloud run services describe onnx-inference
–region $REGION
–format ‘value(status.url)’)
curl -X POST “$SERVICE_URL/generate”
-H “Content-Type: application/json”
-d ‘{“prompt”: “Why is efficient AI important?”, “max_new_tokens”: 50}’
การแก้ไขปัญหา
ปัญหาบางอย่างที่คุณอาจพบ:
- ขาดไฟล์ genai_config.json: ไม่ใช่ทุกโมเดล ONNX บน Hugging Face ที่มีไฟล์การกำหนดค่าที่จำเป็นสำหรับไลบรารี ONNX Runtime GenAI โค้ดตัวอย่างจะพยายามอนุมานการกำหนดค่าหากขาดหายไป แต่ควรใช้โมเดลที่มีการกำหนดค่านั้นมาด้วย
- Execution providers: ตัวอย่างปัจจุบันรวม CUDA, CoreML และ CPU แต่สามารถเพิ่ม provider อื่นๆ ได้ง่าย เช่น TensorRT หรือ OpenVINO
- การปรับแต่งพารามิเตอร์: เมื่อคุณเพิ่ม
max_new_tokensKV cache จะใหญ่ขึ้น และการคำนวณของ attention mechanism ก็จะเพิ่มขึ้นด้วย ต้องระวังการใช้หน่วยความจำและความล่าช้าที่เปลี่ยนแปลงไป
สรุป
โมเดลขนาดเล็กก้าวหน้าไปมาก ด้วย ONNX Runtime GenAI และเทคนิคการควอนไทเซชันที่เหมาะสม ตอนนี้สามารถรัน LLM ที่มีความสามารถไม่ธรรมดาในสภาพแวดล้อมที่เมื่อไม่กี่ปีก่อนยังคิดไม่ถึง
สิ่งนี้เปิดประตูสู่แอปพลิเคชันประเภทใหม่ทั้งหมด: ผู้ช่วยส่วนตัวที่ความเป็นส่วนตัวสมบูรณ์ อุปกรณ์ Edge อัจฉริยะ และ API แบบไม่มีเซิร์ฟเวอร์ที่มีต้นทุนการบำรุงรักษาเกือบเป็นศูนย์
หากต้องการลอง คุณสามารถเริ่มต้นได้อย่างรวดเร็วในไม่กี่นาที คุณสามารถรับโค้ดได้จากที่เก็บ onnx-inference บน GitHub ดูเอกสารทางการของ ONNX Runtime GenAI สำหรับรายละเอียดเพิ่มเติม หรือเรียกดู Hugging Face ONNX Community เพื่อหาโมเดลที่เหมาะสม
ติดตาม “Whale Habitat” Mini Program เพื่อรับข่าวสาร AI ล่าสุด
⚠️ หมายเหตุ: เนื้อหาได้รับการแปลโดย AI และตรวจสอบโดยมนุษย์ หากมีข้อผิดพลาดโปรดแจ้ง
本文来自网络搜集,不代表คลื่นสร้างอนาคต立场,如有侵权,联系删除。转载请注明出处:https://www.itsolotime.com/th/archives/23012
