FakeRockert543 commited on
Commit
9f1c324
·
verified ·
1 Parent(s): bcee64b

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +132 -35
README.md CHANGED
@@ -26,7 +26,11 @@ base_model:
26
 
27
  Apple CoreML 版本的 CKIP BERT-base 繁體中文 NLP 模型,可在 iOS/macOS 上透過 Apple Neural Engine (ANE) 執行。
28
 
29
- [ckiplab/ckip-transformers](https://github.com/ckiplab/ckip-transformers) 轉換,經由 [ckip-mlx](https://huggingface.co/FakeRockert543/ckip-mlx) 中繼。
 
 
 
 
30
 
31
  ## 模型說明
32
 
@@ -46,72 +50,165 @@ Apple CoreML 版本的 CKIP BERT-base 繁體中文 NLP 模型,可在 iOS/macOS
46
  | fp16 | 194 MB | WS 100% / POS 99.97% / NER 99.99% | **推薦預設** ⚡ |
47
  | q8 | 98 MB | WS 99.96% / POS 98.83% / NER 99.76% | 低記憶體 iPhone |
48
 
49
- ## 速度
50
 
51
- 測試環境:Apple M4 Max / 128GB / macOS 26.3.1
52
- 測試資料:維基百科「臺灣」條目,36,245 字
53
 
54
- | Framework | fp32 | fp16 |
55
- |-----------|-----:|-----:|
56
- | **CoreML** | 2,879 ms | **2,352 ms** ⚡ |
57
- | MLX | 2,869 ms | 3,092 ms |
58
- | HF Transformers (MPS) | 3,532 ms | 3,096 ms |
59
- | CKIP 官方 (MPS) | 14,926 ms | 11,850 ms |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
 
61
- CoreML fp16 是所有框架中最快的 CKIP 官方快 **6.3 倍**。
62
 
63
- ## 使用方式
 
 
 
64
 
65
- ### Python
 
 
 
 
66
 
67
  ```python
68
  import coremltools as ct
69
  import numpy as np
70
 
 
 
 
 
 
 
 
71
  model = ct.models.MLModel("ckip_ws_fp16.mlpackage")
72
 
 
73
  text = "台積電今天股價上漲三十元"
74
- input_ids = np.array([[101] + [vocab[ch] for ch in text] + [102]])
75
- attention_mask = np.ones_like(input_ids)
 
76
 
 
77
  out = model.predict({"input_ids": input_ids, "attention_mask": attention_mask})
78
  preds = np.argmax(out["logits"], axis=-1)[0]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  ```
80
 
81
- ### Swift / iOS
82
 
83
  ```swift
84
- let model = try MLModel(contentsOf: modelURL)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  let input = try MLDictionaryFeatureProvider(dictionary: [
86
- "input_ids": MLMultiArray(inputIds),
87
- "attention_mask": MLMultiArray(attentionMask)
88
  ])
89
  let output = try model.prediction(from: input)
90
- ```
91
 
92
- ## 量化精度詳細
 
93
 
94
- 以維基百科「臺灣」條目 36,245 字測試,與 fp32 逐 token 比對(共 36,389 tokens):
95
 
96
- ### fp16
97
- - WS: 1 token 不同 (100.00%)
98
- - POS: 11 tokens 不同 (99.97%)
99
- - NER: 3 tokens 不同 (99.99%)
100
 
101
- ### q8
102
- - WS: 13 tokens 不同 (99.96%)
103
- - POS: 425 tokens 不同 (98.83%)
104
- - NER: 89 tokens 不同 (99.76%)
 
 
105
 
106
  ## 跨框架驗證
107
 
108
  CoreML fp32 與 MLX fp32、HF Transformers fp32 的 WS/POS/NER 輸出**完全一致**,確認轉換正確。
109
 
110
- ## 相關專案
111
-
112
- - [FakeRockert543/ckip-mlx](https://huggingface.co/FakeRockert543/ckip-mlx) — MLX 版本(桌面推薦)
113
- - [FakeRocket543/ckip-coreml](https://github.com/FakeRocket543/ckip-coreml) — 原始碼與轉換腳本
114
-
115
  ## 授權
116
 
117
  [GPL-3.0](https://www.gnu.org/licenses/gpl-3.0.html),依循原始 [ckiplab/ckip-transformers](https://github.com/ckiplab/ckip-transformers) 授權。
 
26
 
27
  Apple CoreML 版本的 CKIP BERT-base 繁體中文 NLP 模型,可在 iOS/macOS 上透過 Apple Neural Engine (ANE) 執行。
28
 
29
+ - 📦 原始碼:[GitHub — FakeRocket543/ckip-coreml](https://github.com/FakeRocket543/ckip-coreml)
30
+ - 🤗 模型權重:[HuggingFace — FakeRockert543/ckip-coreml](https://huggingface.co/FakeRockert543/ckip-coreml)(本頁)
31
+ - 🧪 MLX 版本(桌面推薦):[HuggingFace — FakeRockert543/ckip-mlx](https://huggingface.co/FakeRockert543/ckip-mlx)
32
+
33
+ 從 [ckiplab/ckip-transformers](https://github.com/ckiplab/ckip-transformers) 轉換而來。CoreML fp16 是所有框架中最快的,比 CKIP 官方快 **6.3 倍**。
34
 
35
  ## 模型說明
36
 
 
50
  | fp16 | 194 MB | WS 100% / POS 99.97% / NER 99.99% | **推薦預設** ⚡ |
51
  | q8 | 98 MB | WS 99.96% / POS 98.83% / NER 99.76% | 低記憶體 iPhone |
52
 
53
+ ## 從零開始使用(完整步驟)
54
 
55
+ ### 1. 環境準備
 
56
 
57
+ 需要 macOS + Apple Silicon。CoreML Tools 目前需要 Python 3.13(不支援 3.14)。
58
+
59
+ ```bash
60
+ # 取得原始碼
61
+ git clone https://github.com/FakeRocket543/ckip-coreml.git
62
+ cd ckip-coreml
63
+
64
+ # 建立虛擬環境(需要 Python 3.13)
65
+ python3.13 -m venv .venv && source .venv/bin/activate
66
+
67
+ # 安裝依賴
68
+ pip install coremltools numpy huggingface_hub
69
+ ```
70
+
71
+ ### 2. 下載模型
72
+
73
+ ```bash
74
+ # 從 HuggingFace 下載全部 .mlpackage
75
+ huggingface-cli download FakeRockert543/ckip-coreml --local-dir .
76
+ ```
77
+
78
+ 下載後目錄結構:
79
+
80
+ ```
81
+ ckip-coreml/
82
+ ├── ckip_ws_fp16.mlpackage # 斷詞 fp16(推薦)
83
+ ├── ckip_ws_fp32.mlpackage
84
+ ├── ckip_ws_q8.mlpackage
85
+ ├── ckip_pos_fp16.mlpackage # 詞性 fp16
86
+ ├── ckip_pos_fp32.mlpackage
87
+ ├── ckip_pos_q8.mlpackage
88
+ ├── ckip_ner_fp16.mlpackage # 實體 fp16
89
+ ├── ckip_ner_fp32.mlpackage
90
+ ├── ckip_ner_q8.mlpackage
91
+ ├── ckip_ws.mlpackage # 原始版本 (=fp32)
92
+ ├── ckip_pos.mlpackage
93
+ └── ckip_ner.mlpackage
94
+ ```
95
+
96
+ ### 3. 準備詞表
97
 
98
+ CoreML 模型不包含詞表需要從 MLX 版本取得,或自行下載 BERT 中文詞表:
99
 
100
+ ```bash
101
+ # 方法一:從 MLX repo 下載 vocab.txt
102
+ huggingface-cli download FakeRockert543/ckip-mlx models/vocab.txt --local-dir .
103
+ mv models/vocab.txt vocab.txt && rm -rf models
104
 
105
+ # 方法二:從原始 BERT 下載
106
+ # wget https://huggingface.co/bert-base-chinese/resolve/main/vocab.txt
107
+ ```
108
+
109
+ ### 4. 執行斷詞(Python)
110
 
111
  ```python
112
  import coremltools as ct
113
  import numpy as np
114
 
115
+ # 載入詞表
116
+ vocab = {}
117
+ with open("vocab.txt") as f:
118
+ for i, line in enumerate(f):
119
+ vocab[line.strip()] = i
120
+
121
+ # 載入模型(推薦 fp16)
122
  model = ct.models.MLModel("ckip_ws_fp16.mlpackage")
123
 
124
+ # Tokenize(BERT 單字切分)
125
  text = "台積電今天股價上漲三十元"
126
+ ids = [101] + [vocab.get(ch, 100) for ch in text] + [102] # 101=[CLS], 102=[SEP], 100=[UNK]
127
+ input_ids = np.array([ids], dtype=np.int32)
128
+ attention_mask = np.ones_like(input_ids, dtype=np.int32)
129
 
130
+ # 推論
131
  out = model.predict({"input_ids": input_ids, "attention_mask": attention_mask})
132
  preds = np.argmax(out["logits"], axis=-1)[0]
133
+
134
+ # 解碼斷詞結果(B=0: 詞首, I=1: 詞中)
135
+ words, cur = [], ""
136
+ for i, ch in enumerate(text):
137
+ p = preds[i + 1] # +1 跳過 [CLS]
138
+ if p == 0 and cur:
139
+ words.append(cur)
140
+ cur = ch
141
+ else:
142
+ cur += ch
143
+ if cur:
144
+ words.append(cur)
145
+
146
+ print(words)
147
+ # ['台積電', '今天', '股價', '上漲', '三十', '元']
148
+ ```
149
+
150
+ ### 5. 執行詞性標注(Python)
151
+
152
+ ```python
153
+ import json
154
+
155
+ pos_model = ct.models.MLModel("ckip_pos_fp16.mlpackage")
156
+ out = pos_model.predict({"input_ids": input_ids, "attention_mask": attention_mask})
157
+ preds = np.argmax(out["logits"], axis=-1)[0]
158
+
159
+ # POS id2label 對照表(從 MLX config.json 取得,或用以下常見標籤)
160
+ # 完整對照表見 GitHub repo 的 models/pos/config.json
161
+ for i, ch in enumerate(text):
162
+ print(f"{ch} → label_id={preds[i + 1]}")
163
  ```
164
 
165
+ ### 6. 在 Swift / iOS 中使用
166
 
167
  ```swift
168
+ import CoreML
169
+
170
+ // 載入模型
171
+ let config = MLModelConfiguration()
172
+ config.computeUnits = .all // 使用 ANE + GPU + CPU
173
+ let model = try MLModel(contentsOf: modelURL, configuration: config)
174
+
175
+ // 準備輸入
176
+ let inputIds = try MLMultiArray(shape: [1, seqLen as NSNumber], dataType: .int32)
177
+ let attentionMask = try MLMultiArray(shape: [1, seqLen as NSNumber], dataType: .int32)
178
+
179
+ // 填入 token IDs([CLS] + 單字 IDs + [SEP])
180
+ for (i, id) in tokenIds.enumerated() {
181
+ inputIds[i] = NSNumber(value: id)
182
+ attentionMask[i] = 1
183
+ }
184
+
185
+ // 推論
186
  let input = try MLDictionaryFeatureProvider(dictionary: [
187
+ "input_ids": inputIds,
188
+ "attention_mask": attentionMask
189
  ])
190
  let output = try model.prediction(from: input)
191
+ let logits = output.featureValue(for: "logits")!.multiArrayValue!
192
 
193
+ // 取 argmax 得到預標籤
194
+ ```
195
 
196
+ ## 速度
197
 
198
+ 測試環境:Apple M4 Max / 128GB / macOS 26.3.1
199
+ 測試資料:維基百科「臺灣」條目,36,245 字,10 runs median
 
 
200
 
201
+ | Framework | fp32 | fp16 |
202
+ |-----------|-----:|-----:|
203
+ | **CoreML** | 2,879 ms | **2,352 ms** ⚡ |
204
+ | MLX | 2,869 ms | 3,092 ms |
205
+ | HF Transformers (MPS) | 3,532 ms | 3,096 ms |
206
+ | CKIP 官方 (MPS) | 14,926 ms | 11,850 ms |
207
 
208
  ## 跨框架驗證
209
 
210
  CoreML fp32 與 MLX fp32、HF Transformers fp32 的 WS/POS/NER 輸出**完全一致**,確認轉換正確。
211
 
 
 
 
 
 
212
  ## 授權
213
 
214
  [GPL-3.0](https://www.gnu.org/licenses/gpl-3.0.html),依循原始 [ckiplab/ckip-transformers](https://github.com/ckiplab/ckip-transformers) 授權。