Apple CoreML 版本的 CKIP BERT-base 繁體中文 NLP 模型,可在 iOS/macOS 上透過 Apple Neural Engine (ANE) 執行。
從
ckiplab/ckip-transformers 轉換而來。CoreML fp16 是所有框架中最快的,比 CKIP 官方快
6.3 倍。
1# 取得原始碼
2git clone https://github.com/FakeRocket543/ckip-coreml.git
3cd ckip-coreml
4
5# 建立虛擬環境(需要 Python 3.13)
6python3.13 -m venv .venv && source .venv/bin/activate
7
8# 安裝依賴
9pip install coremltools numpy huggingface_hub
1# 從 HuggingFace 下載全部 .mlpackage
2huggingface-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
1# 方法一:從 MLX repo 下載 vocab.txt
2huggingface-cli download FakeRockert543/ckip-mlx models/vocab.txt --local-dir .
3mv models/vocab.txt vocab.txt && rm -rf models
4
5# 方法二:從原始 BERT 下載
6# wget https://huggingface.co/bert-base-chinese/resolve/main/vocab.txt
1import coremltools as ct
2import numpy as np
3
4# 載入詞表
5vocab = {}
6with open("vocab.txt") as f:
7 for i, line in enumerate(f):
8 vocab[line.strip()] = i
9
10# 載入模型(推薦 fp16)
11model = ct.models.MLModel("ckip_ws_fp16.mlpackage")
12
13# Tokenize(BERT 單字切分)
14text = "台積電今天股價上漲三十元"
15ids = [101] + [vocab.get(ch, 100) for ch in text] + [102] # 101=[CLS], 102=[SEP], 100=[UNK]
16input_ids = np.array([ids], dtype=np.int32)
17attention_mask = np.ones_like(input_ids, dtype=np.int32)
18
19# 推論
20out = model.predict({"input_ids": input_ids, "attention_mask": attention_mask})
21preds = np.argmax(out["logits"], axis=-1)[0]
22
23# 解碼斷詞結果(B=0: 詞首, I=1: 詞中)
24words, cur = [], ""
25for i, ch in enumerate(text):
26 p = preds[i + 1] # +1 跳過 [CLS]
27 if p == 0 and cur:
28 words.append(cur)
29 cur = ch
30 else:
31 cur += ch
32if cur:
33 words.append(cur)
34
35print(words)
36# ['台積電', '今天', '股價', '上漲', '三十', '元']
1import json
2
3pos_model = ct.models.MLModel("ckip_pos_fp16.mlpackage")
4out = pos_model.predict({"input_ids": input_ids, "attention_mask": attention_mask})
5preds = np.argmax(out["logits"], axis=-1)[0]
6
7# POS id2label 對照表(從 MLX config.json 取得,或用以下常見標籤)
8# 完整對照表見 GitHub repo 的 models/pos/config.json
9for i, ch in enumerate(text):
10 print(f"{ch} → label_id={preds[i + 1]}")
1import CoreML
2
3// 載入模型
4let config = MLModelConfiguration()
5config.computeUnits = .all // 使用 ANE + GPU + CPU
6let model = try MLModel(contentsOf: modelURL, configuration: config)
7
8// 準備輸入
9let inputIds = try MLMultiArray(shape: [1, seqLen as NSNumber], dataType: .int32)
10let attentionMask = try MLMultiArray(shape: [1, seqLen as NSNumber], dataType: .int32)
11
12// 填入 token IDs([CLS] + 單字 IDs + [SEP])
13for (i, id) in tokenIds.enumerated() {
14 inputIds[i] = NSNumber(value: id)
15 attentionMask[i] = 1
16}
17
18// 推論
19let input = try MLDictionaryFeatureProvider(dictionary: [
20 "input_ids": inputIds,
21 "attention_mask": attentionMask
22])
23let output = try model.prediction(from: input)
24let logits = output.featureValue(for: "logits")!.multiArrayValue!
25
26// 取 argmax 得到預測標籤