CKIP BERT-base CoreML — 繁體中文 WS/POS/NER for iOS/macOS

Apple CoreML 版本的 CKIP BERT-base 繁體中文 NLP 模型,可在 iOS/macOS 上透過 Apple Neural Engine (ANE) 執行。

ckiplab/ckip-transformers 轉換而來。CoreML fp16 是所有框架中最快的,比 CKIP 官方快 6.3 倍

模型說明

任務 說明 標籤數 原始模型
WS 中文斷詞 2 (B/I) ckiplab/bert-base-chinese-ws
POS 詞性標注 60 ckiplab/bert-base-chinese-pos
NER 命名實體辨識 73 (BIOES) ckiplab/bert-base-chinese-ner

所有模型支援動態序列長度 1–512。

可用版本

版本 單模型大小 精度 (vs fp32) 建議用途
fp32 388 MB baseline (與 MLX fp32 100% 一致) 追求完全精度
fp16 194 MB WS 100% / POS 99.97% / NER 99.99% 推薦預設
q8 98 MB WS 99.96% / POS 98.83% / NER 99.76% 低記憶體 iPhone

從零開始使用(完整步驟)

1. 環境準備

需要 macOS + Apple Silicon。CoreML Tools 目前需要 Python 3.13(不支援 3.14)。

# 取得原始碼
git clone https://github.com/FakeRocket543/ckip-coreml.git
cd ckip-coreml

# 建立虛擬環境(需要 Python 3.13)
python3.13 -m venv .venv && source .venv/bin/activate

# 安裝依賴
pip install coremltools numpy huggingface_hub

2. 下載模型

# 從 HuggingFace 下載全部 .mlpackage
huggingface-cli download FakeRockert543/ckip-coreml --local-dir .

下載後目錄結構:

ckip-coreml/
├── ckip_ws_fp16.mlpackage      # 斷詞 fp16(推薦)
├── ckip_ws_fp32.mlpackage
├── ckip_ws_q8.mlpackage
├── ckip_pos_fp16.mlpackage     # 詞性 fp16
├── ckip_pos_fp32.mlpackage
├── ckip_pos_q8.mlpackage
├── ckip_ner_fp16.mlpackage     # 實體 fp16
├── ckip_ner_fp32.mlpackage
├── ckip_ner_q8.mlpackage
├── ckip_ws.mlpackage           # 原始版本 (=fp32)
├── ckip_pos.mlpackage
└── ckip_ner.mlpackage

3. 準備詞表

CoreML 模型不包含詞表,需要從 MLX 版本取得,或自行下載 BERT 中文詞表:

# 方法一:從 MLX repo 下載 vocab.txt
huggingface-cli download FakeRockert543/ckip-mlx models/vocab.txt --local-dir .
mv models/vocab.txt vocab.txt && rm -rf models

# 方法二:從原始 BERT 下載
# wget https://huggingface.co/bert-base-chinese/resolve/main/vocab.txt

4. 執行斷詞(Python)

import coremltools as ct
import numpy as np

# 載入詞表
vocab = {}
with open("vocab.txt") as f:
    for i, line in enumerate(f):
        vocab[line.strip()] = i

# 載入模型(推薦 fp16)
model = ct.models.MLModel("ckip_ws_fp16.mlpackage")

# Tokenize(BERT 單字切分)
text = "台積電今天股價上漲三十元"
ids = [101] + [vocab.get(ch, 100) for ch in text] + [102]  # 101=[CLS], 102=[SEP], 100=[UNK]
input_ids = np.array([ids], dtype=np.int32)
attention_mask = np.ones_like(input_ids, dtype=np.int32)

# 推論
out = model.predict({"input_ids": input_ids, "attention_mask": attention_mask})
preds = np.argmax(out["logits"], axis=-1)[0]

# 解碼斷詞結果(B=0: 詞首, I=1: 詞中)
words, cur = [], ""
for i, ch in enumerate(text):
    p = preds[i + 1]  # +1 跳過 [CLS]
    if p == 0 and cur:
        words.append(cur)
        cur = ch
    else:
        cur += ch
if cur:
    words.append(cur)

print(words)
# ['台積電', '今天', '股價', '上漲', '三十', '元']

5. 執行詞性標注(Python)

import json

pos_model = ct.models.MLModel("ckip_pos_fp16.mlpackage")
out = pos_model.predict({"input_ids": input_ids, "attention_mask": attention_mask})
preds = np.argmax(out["logits"], axis=-1)[0]

# POS id2label 對照表(從 MLX config.json 取得,或用以下常見標籤)
# 完整對照表見 GitHub repo 的 models/pos/config.json
for i, ch in enumerate(text):
    print(f"{ch} → label_id={preds[i + 1]}")

6. 在 Swift / iOS 中使用

import CoreML

// 載入模型
let config = MLModelConfiguration()
config.computeUnits = .all  // 使用 ANE + GPU + CPU
let model = try MLModel(contentsOf: modelURL, configuration: config)

// 準備輸入
let inputIds = try MLMultiArray(shape: [1, seqLen as NSNumber], dataType: .int32)
let attentionMask = try MLMultiArray(shape: [1, seqLen as NSNumber], dataType: .int32)

// 填入 token IDs([CLS] + 單字 IDs + [SEP])
for (i, id) in tokenIds.enumerated() {
    inputIds[i] = NSNumber(value: id)
    attentionMask[i] = 1
}

// 推論
let input = try MLDictionaryFeatureProvider(dictionary: [
    "input_ids": inputIds,
    "attention_mask": attentionMask
])
let output = try model.prediction(from: input)
let logits = output.featureValue(for: "logits")!.multiArrayValue!

// 取 argmax 得到預測標籤

速度

測試環境:Apple M4 Max / 128GB / macOS 26.3.1 測試資料:維基百科「臺灣」條目,36,245 字,10 runs median

Framework fp32 fp16
CoreML 2,879 ms 2,352 ms
MLX 2,869 ms 3,092 ms
HF Transformers (MPS) 3,532 ms 3,096 ms
CKIP 官方 (MPS) 14,926 ms 11,850 ms

跨框架驗證

CoreML fp32 與 MLX fp32、HF Transformers fp32 的 WS/POS/NER 輸出完全一致,確認轉換正確。

授權

GPL-3.0,依循原始 ckiplab/ckip-transformers 授權。

致謝

Downloads last month
62
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for FakeRockert543/ckip-coreml

Quantized
(2)
this model