ONNX 模型库
返回模型

说明文档

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,无需此变通方法。

与原始模型的差异

此仓库包含 mhenrichsenmhenrichsen/danskgpt-tiny-chat 的格式转换版本。模型权重已从 PyTorch (safetensors) 转换为 ONNX 格式,并生成了量化变体(FP16、INT8、INT4)。未进行任何微调或架构修改。

许可证

此模型根据 Apache License 2.0 分发,与原始模型许可证相同。有关完整的许可证文本,请参阅此仓库中的 LICENSE 文件。

原始模型由 mhenrichsen 提供:mhenrichsen/danskgpt-tiny-chat

varsan-g/danskgpt-tiny-chat-onnx

作者 varsan-g

text-generation transformers.js
↓ 1 ♥ 0

创建时间: 2026-02-19 12:10:58+00:00

更新时间: 2026-02-19 12:32:43+00:00

在 Hugging Face 上查看

文件 (18)

.gitattributes
LICENSE
README.md
added_tokens.json
chat_template.jinja
config.json
generation_config.json
onnx/model.onnx ONNX
onnx/model.onnx_data
onnx/model_fp16.onnx ONNX
onnx/model_fp16.onnx.data
onnx/model_int4.onnx ONNX
onnx/model_int4.onnx.data
onnx/model_int8.onnx ONNX
special_tokens_map.json
tokenizer.json
tokenizer.model
tokenizer_config.json