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-8bit567 MB7.6 ms8.9 ms0.85 GB
fp16aufklarer/GLiNER2.5-Decide-340M-MLX-fp16973 MB8.8 ms10.0 ms1.58 GB
fp32aufklarer/GLiNER2.5-Decide-340M-MLX1.95 GB11.1 ms12.6 ms2.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 ชุดเล็กเหล่านี้ใช้ตรวจพฤติกรรมและความตรงกับต้นฉบับ ไม่ใช่เบนช์มาร์กความแม่นยำแบบกว้าง

ขอบเขตและข้อจำกัด

ความละเอียดตัวเลขและหน่วยความจำ

FP16 ลดพื้นที่เก็บน้ำหนักลงครึ่งหนึ่งเหลือ 973 MB ส่วน INT8 ควอนไทซ์เมทริกซ์ของตัวเข้ารหัสและ embedding ของโทเค็นเป็น 8 บิตเป็นกลุ่มละ 64 โดยคงหัว การนอร์มัลไลซ์ และ activation ไว้ที่ FP16 ได้ไฟล์ 567 MB รันไทม์เก็บเมทริกซ์ INT8 แบบบีบอัดไว้ และถอดรหัสเฉพาะแถว embedding ที่คำขอใช้

การฉายตำแหน่งสัมพัทธ์ของตัวเข้ารหัสขึ้นกับน้ำหนักเท่านั้น จึงคำนวณครั้งเดียวตอนโหลดแทนการคำนวณทุกคำขอ โหมดเสริม GLiNER.load(from:evaluateLayers:) คำนวณเลเยอร์ของตัวเข้ารหัสทีละชั้นเพื่อลดการจองหน่วยความจำสูงสุด

แหล่งที่มาและเครดิต