说明文档
DanskGPT Tiny Chat ONNX
mhenrichsen/danskgpt-tiny-chat 的 ONNX 导出版本,用于 ONNX Runtime、transformers.js 和 @browser-ai/transformers-js。
模型详情
| 属性 | 值 |
|---|---|
| 架构 | LlamaForCausalLM |
| 参数量 | 1B |
| 隐藏层大小 | 2048 |
| 层数 | 22 |
| 注意力头数 | 32 (4 KV) |
| 词表大小 | 32,002 tokens |
| 语言 | 丹麦语 |
| 任务 | 文本生成 (聊天) |
| 聊天模板 | ChatML (<|im_start|>user / <|im_end|>) |
可用变体
| 变体 | 文件 | 大小 | dtype |
描述 |
|---|---|---|---|---|
| FP32 | model.onnx + .onnx_data |
4401 MB | \"fp32\" |
原始精度 |
| FP16 | model_fp16.onnx + .onnx.data |
2201 MB | \"fp16\" |
半精度 (GPU) |
| INT8 | model_int8.onnx |
1102 MB | \"int8\" |
动态 INT8 量化 |
| INT4 | model_int4.onnx + .onnx.data |
910 MB | — | INT4 仅权重量化 |
我应该使用哪个变体?
- CPU 部署:INT8。解码速度快 3.5 倍,体积小 4 倍,单文件自包含。
- GPU 部署:FP16。近乎无损的质量,支持原生 FP16 计算。
- 最大压缩:INT4。解码速度约快 4.2 倍,体积小 4.8 倍。
- 浏览器 / transformers.js:推荐 INT8。自包含(约 1.1 GB 下载量,首次加载后缓存)。
基准测试(CPU,20 个提示词 token,50 步解码)
| 变体 | 提示词延迟 | 解码吞吐量 | 相对 FP32 大小 |
|---|---|---|---|
| FP32 | 137.0 ms | 8.5 tok/s | 1.0x |
| FP16 | 403.4 ms | 3.3 tok/s | 0.50x |
| INT8 | 44.9 ms | 29.5 tok/s | 0.25x |
| INT4 | 125.5 ms | 35.8 tok/s | 0.21x |
FP16 在 CPU 上比 FP32 慢,因为缺乏原生 FP16 计算支持。FP16 仅适用于 GPU。
相对 FP32 的精度
| 变体 | 余弦相似度 | Top-1 匹配 | 解码差异 |
|---|---|---|---|
| FP16 | 1.000000 | 是 | 0% |
| INT8 | 0.945775 | 是 | 80% |
| INT4 | 0.982727 | 是 | 97% |
FP16 几乎无损。INT8/INT4 由于自回归误差放大显示出贪婪解码差异,但在温度采样下,质量差异通常可以接受。
文件结构
onnx/
model.onnx # FP32
model.onnx_data
model_fp16.onnx # FP16
model_fp16.onnx.data
model_int8.onnx # INT8 (自包含)
model_int4.onnx # INT4
model_int4.onnx.data
config.json
generation_config.json
tokenizer.json
tokenizer.model
tokenizer_config.json
special_tokens_map.json
added_tokens.json
chat_template.jinja
使用方法
使用 @browser-ai/transformers-js(Vercel AI SDK)
使用 @browser-ai/transformers-js 在浏览器或 Node.js 中结合 Vercel AI SDK 运行此模型:
npm i @browser-ai/transformers-js @huggingface/transformers ai
import { streamText } from \"ai\";
import { transformersJS } from \"@browser-ai/transformers-js\";
const result = streamText({
model: transformersJS(\"varsan-g/danskgpt-tiny-chat-onnx\", {
dtype: \"int8\", // 推荐用于浏览器/CPU (~1.1 GB)
}),
messages: [
{ role: \"user\", content: \"Hvad er Danmark?\" },
],
temperature: 0.7,
maxTokens: 200,
});
for await (const chunk of result.textStream) {
process.stdout.write(chunk);
}
带下载进度(浏览器)
const model = transformersJS(\"varsan-g/danskgpt-tiny-chat-onnx\", {
dtype: \"int8\",
initProgressCallback: (progress) => {
console.log(`Loading: ${Math.round(progress * 100)}%`);
},
});
// 在生成前预加载
await model.createSessionWithProgress((progress) => {
console.log(`Download: ${Math.round(progress * 100)}%`);
});
Web Worker 模式(保持 UI 响应)
// worker.ts
import { TransformersJSWorkerHandler } from \"@browser-ai/transformers-js\";
const handler = new TransformersJSWorkerHandler();
self.onmessage = (msg: MessageEvent) => handler.onmessage(msg);
// main.ts
const model = transformersJS(\"varsan-g/danskgpt-tiny-chat-onnx\", {
dtype: \"int8\",
worker: new Worker(new URL(\"./worker.ts\", import.meta.url), { type: \"module\" }),
});
使用 @huggingface/transformers(直接调用)
直接使用 @huggingface/transformers 获得更底层的控制:
npm i @huggingface/transformers
import { pipeline } from \"@huggingface/transformers\";
const generator = await pipeline(
\"text-generation\",
\"varsan-g/danskgpt-tiny-chat-onnx\",
{ dtype: \"int8\" }
);
const messages = [
{ role: \"user\", content: \"Fortæl mig om dansk historie.\" },
];
const result = await generator(messages, {
max_new_tokens: 200,
temperature: 0.7,
do_sample: true,
});
console.log(result[0].generated_text.at(-1).content);
使用 TextStreamer 进行流式输出
import { AutoTokenizer, AutoModelForCausalLM, TextStreamer } from \"@huggingface/transformers\";
const tokenizer = await AutoTokenizer.from_pretrained(\"varsan-g/danskgpt-tiny-chat-onnx\");
const model = await AutoModelForCausalLM.from_pretrained(\"varsan-g/danskgpt-tiny-chat-onnx\", {
dtype: \"int8\",
});
const messages = [{ role: \"user\", content: \"Hvad er Danmark?\" }];
const inputs = tokenizer.apply_chat_template(messages, {
add_generation_prompt: true,
return_dict: true,
});
const streamer = new TextStreamer(tokenizer, {
skip_prompt: true,
skip_special_tokens: true,
callback_function: (text) => process.stdout.write(text),
});
await model.generate({ ...inputs, max_new_tokens: 200, do_sample: true, temperature: 0.7, streamer });
注意:这是一个 10 亿参数的模型。INT8 版本约 1.1 GB,首次加载时需要一些时间下载(之后会在浏览器中缓存)。如需更快的浏览器体验,可考虑使用 onnx-community 的更小模型。
使用 Optimum(Python)
from optimum.onnxruntime import ORTModelForCausalLM
from transformers import AutoTokenizer
model = ORTModelForCausalLM.from_pretrained(\"varsan-g/danskgpt-tiny-chat-onnx\")
tokenizer = AutoTokenizer.from_pretrained(\"varsan-g/danskgpt-tiny-chat-onnx\", use_fast=False)
prompt = \"<|im_start|>user\nHvad er Danmark?<|im_end|>\n<|im_start|>assistant\n\"
inputs = tokenizer(prompt, return_tensors=\"pt\")
outputs = model.generate(**inputs, max_new_tokens=100, do_sample=True, temperature=0.7)
print(tokenizer.decode(outputs[0], skip_special_tokens=False))
分词器注意事项(Python):此模型使用 SentencePiece
.model文件。在 Python 中,你必须向AutoTokenizer.from_pretrained()传递use_fast=False,否则尝试将分词器解析为 tiktoken 时可能会失败。JavaScript 库使用tokenizer.json,无需此变通方法。
与原始模型的差异
此仓库包含 mhenrichsen 的 mhenrichsen/danskgpt-tiny-chat 的格式转换版本。模型权重已从 PyTorch (safetensors) 转换为 ONNX 格式,并生成了量化变体(FP16、INT8、INT4)。未进行任何微调或架构修改。
许可证
此模型根据 Apache License 2.0 分发,与原始模型许可证相同。有关完整的许可证文本,请参阅此仓库中的 LICENSE 文件。
varsan-g/danskgpt-tiny-chat-onnx
作者 varsan-g
创建时间: 2026-02-19 12:10:58+00:00
更新时间: 2026-02-19 12:32:43+00:00
在 Hugging Face 上查看