GLiNER: การตัดสินใจและการดึงเอนทิตีบนเครื่อง
พรีวิวสำหรับการพัฒนา น้ำหนักเผยแพร่บน Hugging Face แล้ว ส่วนโมดูล Swift อยู่ระหว่างรีวิวและยังไม่รวมอยู่ในรุ่นเผยแพร่ของ speech-swift
โมดูล GLiNER รัน GLiNER2.5-Decide ด้วย MLX Swift ส่งข้อความและรายการป้ายกำกับที่อนุญาตเพื่อรับคะแนนการจัดประเภท หรือขอช่วงข้อความของเอนทิตี เช่น บุคคลและเวลา
หลักการทำงาน
ตัวเข้ารหัส DeBERTa อ่านข้อความและสคีมาไปพร้อมกัน หัวจัดประเภทให้คะแนนป้ายกำกับของคุณ หัวเอนทิตีระบุช่วงในประโยคต้นฉบับ รันไทม์ไม่ได้สร้างคำตอบ JSON ทีละโทเค็น
import GLiNER
let model = try await GLiNER.fromPretrained()
let choices = try model.classify(
"Remind me to call Dad at six PM.",
labels: ["create_reminder", "send_message", "other"]
)
let spans = try model.extractEntities(
"Remind me to call Dad at six PM.",
labels: ["person", "time"]
)
น้ำหนัก
การแปลง MLX สามแบบของรุ่นต้นทางที่ตรึงไว้ 7ee5da4c เผยแพร่บน Hugging Face รันไทม์จะดาวน์โหลดแบบที่เลือกเมื่อใช้งานครั้งแรก แล้วใช้แคชในเครื่องต่อจากนั้น โดยไม่ต้องใช้ Python
| แบบ | ที่เก็บ | น้ำหนัก | การจัดเส้นทาง | การดึงข้อมูล | หน่วยความจำสูงสุด |
|---|---|---|---|---|---|
int8 (ค่าเริ่มต้น) | aufklarer/GLiNER2.5-Decide-340M-MLX-8bit | 567 MB | 7.6 ms | 8.9 ms | 0.85 GB |
fp16 | aufklarer/GLiNER2.5-Decide-340M-MLX-fp16 | 973 MB | 8.8 ms | 10.0 ms | 1.58 GB |
fp32 | aufklarer/GLiNER2.5-Decide-340M-MLX | 1.95 GB | 11.1 ms | 12.6 ms | 2.55 GB |
Apple M5 Pro ไม่มีงานอื่นรันอยู่: ค่ามัธยฐานของคำขอเต็มรูปแบบรวมการตัดโทเค็น และหน่วยความจำสูงสุดของโปรเซส ทั้งสามแบบให้ป้ายกำกับ ช่วงข้อความ และออฟเซ็ตตรงกับโมเดล PyTorch ต้นฉบับใน 24 กรณีอ้างอิง โดยค่าความมั่นใจต่างกันไม่เกิน 0.006
บรรทัดคำสั่ง
CLI speech มีทั้งสองงานในชื่อ speech gliner classify และ speech gliner extract ส่งป้ายกำกับเป็นรายการคั่นด้วยจุลภาค และระบุ --description label=text ซ้ำได้ตามต้องการ หากไม่ระบุข้อความจะอ่านจาก stdin --variant เลือก int8 (ค่าเริ่มต้น), fp16 หรือ fp32 และ --model-dir โหลดชุดไฟล์ในเครื่องแทนการดาวน์โหลด อาร์กิวเมนต์ที่ไม่ถูกต้องจะถูกปฏิเสธก่อนโหลดโมเดล เมื่อใช้ --json ผลลัพธ์จะมีความน่าจะเป็นของทุกป้ายกำกับ หรือช่วงข้อความพร้อมออฟเซ็ต UTF-16 รวมถึงเวลาโหลดและเวลาอนุมาน
swift build -c release --product speech --disable-sandbox
scripts/build_mlx_metallib.sh release
.build/release/speech gliner classify "Remind me to call Dad at six PM." \
--labels create_reminder,send_message,set_timer,other
.build/release/speech gliner extract "Remind me to call Dad at six PM." \
--labels person,time --json
การ์ดโมเดลสำหรับเอเจนต์เป็นไฟล์ Markdown ที่ระบุ API ที่แน่นอน ฟิลด์ผลลัพธ์ และผลลัพธ์ที่ตรวจสอบแล้ว
ความแม่นยำบนชุดคำสั่งขนาดเล็ก
ตัวอย่างการจัดเส้นทางที่เขียนเองสิบหกรายการตรงตามคาด 12 รายการ และตัวอย่างการดึงข้อมูลแปดรายการตรง 7 รายการ พอร์ต Swift ทำซ้ำโมเดล PyTorch ต้นฉบับได้ใน 24 กรณีอ้างอิง ทั้ง ID โทเค็น ป้ายกำกับ และช่วงข้อความตรงกัน คะแนนต่างกันไม่เกิน 0.001 ชุดเล็กเหล่านี้ใช้ตรวจพฤติกรรมและความตรงกับต้นฉบับ ไม่ใช่เบนช์มาร์กความแม่นยำแบบกว้าง
ขอบเขตและข้อจำกัด
- การจัดประเภทแบบป้ายกำกับเดียวและช่วงข้อความของเอนทิตี สูงสุด 512 โทเค็นที่เข้ารหัสแล้วต่อคำขอ
- เช็กพอยต์ span/count_lstm ที่ใช้ relative attention ร่วมกัน ในแบบ FP32, FP16 หรือ INT8 โมเดล boundary กราฟความสัมพันธ์ และข้อจำกัดร่วม ไม่อยู่ใน API รุ่นแรกนี้
- ออฟเซ็ตของเอนทิตีใช้ UTF-16 เหมือน NSRange วันที่และเวลาต้องปรับให้เป็นมาตรฐานแยกต่างหาก
- คะแนนไม่ได้รับประกันว่าการตัดสินใจถูกต้อง โมดูลไม่เรียกใช้เครื่องมือใด ๆ
- ขนาดดาวน์โหลดโมเดล หน่วยความจำของโปรเซส และการใช้หน่วยความจำรวมจริง เป็นการวัดคนละแบบ
ความละเอียดตัวเลขและหน่วยความจำ
FP16 ลดพื้นที่เก็บน้ำหนักลงครึ่งหนึ่งเหลือ 973 MB ส่วน INT8 ควอนไทซ์เมทริกซ์ของตัวเข้ารหัสและ embedding ของโทเค็นเป็น 8 บิตเป็นกลุ่มละ 64 โดยคงหัว การนอร์มัลไลซ์ และ activation ไว้ที่ FP16 ได้ไฟล์ 567 MB รันไทม์เก็บเมทริกซ์ INT8 แบบบีบอัดไว้ และถอดรหัสเฉพาะแถว embedding ที่คำขอใช้
การฉายตำแหน่งสัมพัทธ์ของตัวเข้ารหัสขึ้นกับน้ำหนักเท่านั้น จึงคำนวณครั้งเดียวตอนโหลดแทนการคำนวณทุกคำขอ โหมดเสริม GLiNER.load(from:evaluateLayers:) คำนวณเลเยอร์ของตัวเข้ารหัสทีละชั้นเพื่อลดการจองหน่วยความจำสูงสุด