- Transformers.js เป็นไลบรารีสำหรับรันโมเดล 🤗 Transformers ในเบราว์เซอร์โดยไม่ต้องมีเซิร์ฟเวอร์ โดยมุ่งให้มีความสามารถเทียบเท่าและมี API ใกล้เคียงกับ Python
transformers ของ Hugging Face
- การรันโมเดลใช้ ONNX Runtime และโมเดลที่พรีเทรนด้วย PyTorch·TensorFlow·JAX สามารถแปลงเป็น ONNX เพื่อใช้งานได้ด้วย 🤗 Optimum
- สามารถเรียกใช้งานงานอย่างการวิเคราะห์อารมณ์ด้วย API แบบ
pipeline ในลักษณะคล้าย Python และเลือกโมเดลอื่นได้โดยระบุ model ID หรือพาธเป็นอาร์กิวเมนต์ตัวที่สอง
- ค่าปริยายในการรันบนเบราว์เซอร์คือ CPU แบบ WASM และสามารถเลือกให้รันด้วย WebGPU ได้ผ่าน
device: 'webgpu' แต่ WebGPU API ยังเป็นฟีเจอร์ทดลองในหลายเบราว์เซอร์
- ในสภาพแวดล้อมที่ทรัพยากรจำกัดอย่างเว็บเบราว์เซอร์ สามารถเลือกชนิดข้อมูลอย่าง
"fp32", "fp16", "q8", "q4" ผ่าน dtype เพื่อปรับแบนด์วิดท์และประสิทธิภาพได้
รัน Transformers ในเบราว์เซอร์
- Transformers.js เป็นไลบรารีที่ออกแบบมาเพื่อให้รัน 🤗 Transformers ได้โดยตรงในเบราว์เซอร์โดยไม่ต้องมีเซิร์ฟเวอร์
- ตั้งเป้าให้มีประสบการณ์ใช้งานที่เทียบเท่ากับไลบรารี Python transformers ของ Hugging Face ในเชิงความสามารถ และสามารถรันโมเดลพรีเทรนเดียวกันได้ด้วย API ที่ใกล้เคียงกันมาก
- งานที่รองรับครอบคลุมหลายโมดาลิตี
- การประมวลผลภาษาธรรมชาติ: การจัดประเภทข้อความ, การรู้จำชื่อเฉพาะ, การตอบคำถาม, language modeling, การสรุปความ, การแปล, ปรนัยหลายตัวเลือก, การสร้างข้อความ
- คอมพิวเตอร์วิทัศน์: การจัดประเภทภาพ, การตรวจจับวัตถุ, การแบ่งส่วนภาพ, การประมาณค่าความลึก
- เสียง: การรู้จำเสียงพูดอัตโนมัติ, การจัดประเภทเสียง, การแปลงข้อความเป็นเสียงพูด
- มัลติโหมด: embeddings, zero-shot audio classification, zero-shot image classification, zero-shot object detection
วิธีรันและการแปลงโมเดล
การติดตั้งและการใช้งานในเบราว์เซอร์
- ติดตั้งแพ็กเกจ NPM ได้ด้วยคำสั่งต่อไปนี้
npm i @huggingface/transformers
- สามารถใช้งานใน vanilla JS ได้โดยไม่ต้องมี bundler และ import เป็น ES Modules ผ่าน CDN หรือ static hosting ได้
<script type="module">
import { pipeline } from 'https://cdn.jsdelivr.net/npm/@huggingface/transformers@4.2.0';
</script>
pipeline API ที่คล้ายกับ Python
- API แบบ
pipeline เป็นวิธีที่ง่ายที่สุดในการรันโมเดลในไลบรารี โดยรวมโมเดลพรีเทรน, การเตรียมข้อมูลนำเข้า, และการประมวลผลผลลัพธ์หลังรันไว้ด้วยกัน
- เช่นเดียวกับตัวอย่าง sentiment analysis ใน Python
transformers ฝั่ง JavaScript ก็สามารถสร้าง pipeline('sentiment-analysis') แล้วป้อนข้อความเพื่อรับผลลัพธ์ได้
import { pipeline } from '@huggingface/transformers';
const pipe = await pipeline('sentiment-analysis');
const out = await pipe('I love transformers!');
// [{'label': 'POSITIVE', 'score': 0.999817686}]
- หากต้องการใช้โมเดลอื่น ให้ระบุ model ID หรือพาธ เป็นอาร์กิวเมนต์ตัวที่สองของฟังก์ชัน
pipeline
const pipe = await pipeline(
'sentiment-analysis',
'Xenova/bert-base-multilingual-uncased-sentiment'
);
CPU, WebGPU และตัวเลือกการควอนไทซ์
- ค่าปริยายของการรันในเบราว์เซอร์คือการรันบน CPU แบบ WASM
- หากต้องการรันบน GPU ให้ตั้งค่า
device: 'webgpu'
const pipe = await pipeline(
'sentiment-analysis',
'Xenova/distilbert-base-uncased-finetuned-sst-2-english',
{
device: 'webgpu',
}
);
- รายละเอียดเพิ่มเติมเกี่ยวกับ WebGPU มีอยู่ใน WebGPU guide
- เนื่องจาก WebGPU API ยังเป็นฟีเจอร์ทดลองในหลายเบราว์เซอร์ หากเกิดปัญหาก็มีคำแนะนำให้ส่งรายงานบั๊กของ WebGPU
- ในสภาพแวดล้อมของเว็บเบราว์เซอร์ที่ทรัพยากรจำกัด แนะนำให้ใช้โมเดลแบบควอนไทซ์
- เลือกชนิดข้อมูลของโมเดลได้ผ่านตัวเลือก
dtype
- ตัวเลือกที่ใช้กันทั่วไปคือ
"fp32" ซึ่งเป็นค่าปริยายของ WebGPU, "fp16", "q8" ซึ่งเป็นค่าปริยายของ WASM, และ "q4"
- รายละเอียดเพิ่มเติมมีอยู่ใน quantization guide
const pipe = await pipeline(
'sentiment-analysis',
'Xenova/distilbert-base-uncased-finetuned-sst-2-english',
{
dtype: 'q4',
}
);
การตั้งค่าแบบกำหนดเอง
import { env } from '@huggingface/transformers';
env.localModelPath = '/path/to/models/';
env.allowRemoteModels = false;
env.backends.onnx.wasm.wasmPaths = '/path/to/files/';
- การตั้งค่าที่ใช้งานได้ทั้งหมดมีอยู่ใน API Reference
- เมื่อต้องแปลงโมเดล PyTorch เป็น ONNX แนะนำให้ใช้วิธีคำสั่งเดียวผ่าน Optimum
งานที่รองรับและขอบเขตของโมเดล
- หากต้องการหาโมเดลที่เข้ากันได้บน Hugging Face Hub สามารถกรองด้วยแท็กไลบรารี transformers.js ได้
- งานที่รองรับครอบคลุม NLP, วิชัน, เสียง, มัลติโหมด และ reinforcement learning โดยบางงานยังไม่รองรับ
- ฝั่ง NLP รองรับ fill-mask, question-answering, summarization, text-classification, text-generation, token-classification, translation, zero-shot-classification, feature-extraction เป็นต้น
- ฝั่งวิชันรองรับ background-removal, depth-estimation, image-classification, image-segmentation, image-to-image, object-detection, image-feature-extraction เป็นต้น
- ฝั่งเสียงรองรับ audio-classification, automatic-speech-recognition, text-to-speech
- ฝั่งมัลติโหมดรองรับ document-question-answering, image-to-text, zero-shot audio/image classification, zero-shot object detection เป็นต้น
- มีการระบุงานที่ยังไม่รองรับไว้ด้วย
- table-question-answering, mask-generation, video-classification, unconditional-image-generation
- audio-to-audio, tabular-classification, tabular-regression
- text-to-image, visual-question-answering
- รายการสถาปัตยกรรมโมเดลที่รองรับมีหลายตระกูล เช่น BERT, BART, CLIP, DistilBERT, Whisper, Llama, Qwen, Gemma, Phi, Segment Anything, ViT และอีกจำนวนมาก
- หากงานหรือโมเดลที่ต้องการไม่มีในรายการ หรือยังไม่รองรับ สามารถเปิดคำขอฟีเจอร์ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
CLIP ในเบราว์เซอร์: https://observablehq.com/@simonw/openai-clip-in-a-browser
ตรวจจับวัตถุในภาพด้วย detra-resnet-50: https://observablehq.com/@simonw/detect-objects-in-images
ขนาดโมเดลตอนแรกอาจดูเหมือนเป็นข้อจำกัด แต่ก็มีแอปอยู่ไม่น้อยที่การบอกผู้ใช้ซึ่งมีโน้ตบุ๊กและการเชื่อมต่อที่ดีให้รอโหลดสักประมาณ 30 วินาทีนั้นไม่ได้ดูไม่สมเหตุสมผล
รีลีสล่าสุดเพิ่มการรองรับ quantization ของ binary embedding แล้ว เลยอยากลองมาก: https://github.com/xenova/transformers.js/releases/tag/2.17....
ผมทำแพ็กเกจ npm ของ transformers.js v3 ไว้แล้ว และน่าจะต้องอัปเดต ยังไม่แน่ใจว่ารวมฟีเจอร์นี้ไว้หรือยัง
ที่ผ่านมาดูแล fork ไว้เพื่อให้รันบน bun เป็นหลัก แต่พอ v3 ออก จะรองรับ bun อย่างจริงจัง อย่างไรก็ตาม WebGPU คงใช้ไม่ได้ แต่ก็เป็นฟีเจอร์เสริม
[แก้ไข: ถ้าอยากใช้ให้ DM มา ไม่อยากโปรโมต fork]
แม้จะมีแค่ 384 มิติ แต่ทำงานกับข้อความระดับย่อหน้าได้ดีจนน่าประหลาดใจ ในตารางจัดอันดับก็ยังอยู่สูงกว่า text-embedding-ada-002
https://huggingface.co/spaces/mteb/leaderboard
https://syntax.fm/show/740/local-ai-models-in-javascript-mac...
ผมทำเว็บแอปเล็ก ๆ สำหรับ ลบพื้นหลัง รูปภาพด้วยโมเดล RMBG1.4 ของ BRIA AI: https://aether.nco.dev
ชอบมากตรงที่ไม่ต้องส่งข้อมูลไป API และยังรันบนสมาร์ตโฟนได้ด้วย คิดว่าในอนาคตจะมีโปรเจกต์จำนวนมากขึ้นที่ใช้มันกับโมเดล vision, language และ utility ขนาดเล็กอื่น ๆ (เช่น ประมาณความลึก ลบพื้นหลัง ฯลฯ) และอนาคตของเว็บก็ดูสดใส
โปรเจกต์ถัดไปก็กำลังทำอยู่แล้ว และที่นั่นก็คงจะใช้ transformers.js อีกแน่นอน
แผนคือทดสอบ embedding และกลยุทธ์การค้นหาสำหรับ กลยุทธ์ RAG หลายแบบที่จะใช้บนเซิร์ฟเวอร์หรือแอป Electron
ทั้งสองแบบไม่น่าใช้
ระยะยาว เบราว์เซอร์อาจควรฝังโมเดลบางส่วนไว้และเปิดให้ใช้ผ่าน Web API มาตรฐาน แต่ยังไม่เคยได้ยินว่ามีความพยายามแบบนั้นกำลังดำเนินอยู่
(44MB) ลบพื้นหลังในเบราว์เซอร์: https://huggingface.co/spaces/Xenova/remove-background-web. มีเวอร์ชัน WebGPU ด้วย: https://huggingface.co/spaces/Xenova/remove-background-webgp...
(51MB) Whisper Web สำหรับรู้จำเสียงพูดอัตโนมัติ: https://huggingface.co/spaces/Xenova/whisper-web เลือกเวอร์ชัน quantized ได้ในการตั้งค่า
(28MB) Depth Anything Web สำหรับประมาณความลึกแบบภาพเดี่ยว: https://huggingface.co/spaces/Xenova/depth-anything-web
(14MB) Segment Anything Web สำหรับ segmentation ภาพ: https://huggingface.co/spaces/Xenova/segment-anything-web
(20MB) Doodle Dash เกมรู้จำภาพสเก็ตช์ด้วยแมชชีนเลิร์นนิง: https://huggingface.co/spaces/Xenova/doodle-dash
และยังมีอีกมากมาย ดูตัวอย่างอื่น ๆ ได้ในคอลเลกชันเดโม Transformers.js: https://huggingface.co/collections/Xenova/transformersjs-dem...
โมเดลจะถูก แคชแยกตามโดเมน (ใช้ Web Cache API) จึงไม่จำเป็นต้องดาวน์โหลดใหม่ทุกครั้งที่โหลดหน้าเว็บ หากต้องการคงโมเดลไว้ข้ามโดเมน ก็สามารถสร้างส่วนขยายเบราว์เซอร์ด้วยไลบรารีนี้ได้
ส่วนที่พูดถึงท้ายสุดนั้นมีความพยายามที่กำลังดำเนินอยู่ แต่ยังไม่ถึงขั้นที่จะเล่าได้
เว็บแอปที่ต้องใช้ข้อมูลระดับกิกะไบต์บนไคลเอนต์นั้นสร้างให้ใช้งานได้จริงได้ยาก ไม่มีวิธีที่มั่นคงพอจะรับประกันได้ว่าข้อมูลจะค้างอยู่ในแคชนานเท่าที่ผู้ใช้ต้องการ และถึงแม้จะแคชได้อย่างมั่นคง นโยบาย การแบ่งพาร์ทิชันแคช ของเบราว์เซอร์ก็ทำให้แต่ละไซต์ที่ใช้โมเดลเดียวกันต้องดาวน์โหลดและใช้พื้นที่จัดเก็บซ้ำกัน
ข้อความในคอมเมนต์เดิมอย่าง “ดูไม่เหมาะกับการใช้งานจริงอย่างยิ่ง”, “โดยทั่วไปโมเดลค่อนข้างใหญ่” และ “150 เว็บไซต์ × โมเดล 800MB” ดูเหมือนเป็นการใส่เงื่อนไขกำกับตัวเองอยู่แล้วว่าผู้เขียนยังเข้าใจไม่เพียงพอ
อีกข้อดีใหญ่คือ transformers รันบน Node.js ได้ด้วย การสร้างสภาพแวดล้อมรันไทม์นั้นง่ายกว่าการจัดชุด Python กับ dependency แปลก ๆ ให้เข้ากันได้มาก
น่าจะดีขึ้นได้เมื่อระบบปฏิบัติการเริ่มติดตั้งโมเดลไว้ล่วงหน้า และผู้พัฒนาเบราว์เซอร์ก็มี API ที่นำไปใช้ได้
ถึงอย่างนั้น สำหรับงานส่วนใหญ่ โมเดลที่โฮสต์บนคลาวด์ก็น่าจะดีกว่ามากอยู่เสมอ
มี benchmark ของ WebGPU embedding บน Hugging Face Space ให้พอประเมินการทำงานแบบ forward pass ได้: https://huggingface.co/spaces/Xenova/webgpu-embedding-benchm...
ตัวมันเองน่าประทับใจ แต่ถ้าใช้ latency ระดับนั้นมาฝึกโมเดลคงทรมานทีเดียว ที่ fp16, batch 32, sequence length 512 การทำ forward pass ของโมเดล 22 ล้านพารามิเตอร์ใช้เวลาประมาณ 500ms
ดูเหมือนว่าน่าจะมีศักยภาพสำหรับการคาดการณ์แบบ on-demand แน่นอน