简体中文 | English
统一的 C++ / Python 会话式 API:对话、流式、多模态、结构化输出、OpenAI 服务, 全部落在板载 BPU 上。跑在官方通用运行时之上,不需要额外的大模型 SDK。
import bllm
llm = bllm.load("~/models/qwen3.5-2b") # 一个目录 = 一个模型
for chunk in llm.stream_chat("用一句话介绍北京"):
print(chunk, end="", flush=True)conda install -c https://mirrors.ruis.ai/conda -c conda-forge bllm它是视觉框架 bcdl(RDK BPU 视觉推理)的大模型姊妹库, 两者共享同一块 BPU 并可协同调度。

Qwen3.5-2B VLM(图文,混合 SSM + 自建视觉塔,ctx4k)在 RDK S100P BPU 上原生流式对话,中英双语,第二轮不重新给图也能准确数出遥控器数量
导航: 为什么用 · 与官方运行时的关系 · 架构 · 快速上手 · 能做什么 · 服务化部署 · 多模态 · 与视觉共享 BPU · 性能 · 支持的模型 · 能力清单 · 从源码构建 · 社区交流
端侧跑大模型,难的不是"推理一次",而是:模型目录怎么组织、停止符从哪来、 ChatML 模板怎么拼、KV / SSM 缓存怎么管、多轮怎么不越界、采样怎么可复现、 输出的 JSON 怎么保证能解析、要对外提供服务怎么办、和视觉任务抢 BPU 怎么办。 BLLM 把这些做成默认行为。
- ✅ 一行加载 ——
bllm.load(dir):自动识别模型类型、发现对话模板、按权威性 解析停止符(猜错 eos 的下场是模型永不停止),裸.hbm也能直接吃。 - ✅ 一行安装 —— 预编译 conda 包(Python 3.9–3.14),板上不需要编译。
- ✅ 统一的会话 API —— 对话 / 流式 / 多轮 / 采样 / 多模态用同一套接口, C++ 与 Python 对等;换模型不换代码。
- ✅ 结构化输出是保证,不是请求 —— GBNF 语法约束 + JSON Schema → 语法,
解码期就只允许仍能满足语法的 token,所以
json.loads()不会失败。 - ✅ 开箱即用的服务化 —— OpenAI 兼容 HTTP(流式 + 非流式)+ Docker 镜像 + 对话前缀缓存(板上实测 31.6s → 1.3s,约 25×)。
- ✅ 覆盖官方没覆盖的架构 —— Qwen3.5 混合 Gated-DeltaNet/SSM 严格 100% 落 BPU (BLLM 原生独有),另有 GLM-Edge、Phi-4-mini。
- ✅ 能和视觉共存 —— 单 BPU 核上把 LLM 优先级压低,同驻检测器的 p99 从 41 ms 降到 2.95 ms,不是"各跑各的然后互相拖死"。
BLLM 的算力同样来自 D-Robotics 官方 BPU 运行时(hbDNN / hbUCP),也同样
可以直接吃官方发布的 .hbm。下表比较的是抽象层次与定位,不是优劣:
| 官方 OE-LLM 运行时(示例级) | BLLM | |
|---|---|---|
| 形态 | 独立的大模型运行时 + 示例程序 | 可复用的框架,直接跑在通用 hbDNN / hbUCP 上,无需额外大模型 SDK |
| 接口 | 以 C API 为主 | C++17 库 + Python 绑定,任务式会话 API |
| 加载模型 | 按示例的路径与参数组织 | bllm.load(dir) 一行;bllm-make-model-dir 生成清单并解析停止符 |
| 模型覆盖 | 官方发布的 .hbm |
官方 .hbm 加上官方未覆盖的架构(Qwen3.5 混合 SSM / GLM-Edge / Phi-4-mini) |
| 会话 | 模板、历史、缓存自己拼 | 内置 C++ tokenizer、ChatML 模板、多轮、流式、提示缓存 |
| 生成控制 | 基础采样 | 全套采样 + logit_bias + logprobs + GBNF 语法约束 |
| 服务化 | 自行搭建 | OpenAI 兼容 HTTP + Docker + 前缀缓存 + /metrics |
| 与视觉共存 | 自行处理 | BPU 优先级 / 时间片控制,与 bcdl 协同 |
一句话:官方运行时证明了 BPU 能跑大模型;BLLM 让你几分钟内把它做成产品。
你的应用 / OpenAI 兼容客户端
↓
┌───────────────────────────────────────────────┐
│ BLLM │
│ 会话与模板 · 采样与语法约束 · KV/SSM 缓存 │
│ 视觉塔与多模态 · 前缀缓存 · HTTP 服务 │
└───────────────────────────────────────────────┘
↓
D-Robotics hobot 运行时(官方,通用)
hbDNN · hbUCP
↓
BPU "Nash"
自建的原生推理引擎:解码循环、KV / SSM 缓存、采样器、tokenizer 都在 BLLM 里, 下面只依赖板子本来就有的通用 BPU 运行时 —— 和视觉栈用的是同一个驱动, 所以两者可以同板共存、互相调度。
板上(aarch64,conda 环境)直接从我们的 conda 源安装:
conda install -c https://mirrors.ruis.ai/conda -c conda-forge bllm装上 bllm(Python 绑定)、libbllm(C++ 库 + 头文件 + cmake 配置)及其运行时依赖
(hobot-dnn、tokenizers-cpp)。RDK 平台运行库随板系统提供。
还需要一次性把 ION carveout 调大,然后重启 —— 模型权重活在 ION 里而不是进程 RSS, carveout 不够时运行时会在 alloc 处直接段错误:
sudo /usr/hobot/bin/hb_switch_ion.sh balanced && sudo reboot # ≤3B;7B 用 bpu_first性能模式不跨重启保持,每次开机设一遍(见 docs/MODELS.zh.md)。
最快的一条:下载我们编译好、可直接 bllm.load() 的模型包(文件名已标注
上下文长度 / 目标板子 / 量化位宽)。Qwen3.5 图文(VLM,S100P,ctx4k/ctx512 两档)发布在
Hugging Face,附带完整验收数据的 model card:
📦 ruisv/bllm-qwen3.5-0.8b · ruisv/bllm-qwen3.5-2b · ruisv/bllm-qwen3.5-4b
sha256sum -c qwen3.5-4b-ctx512-int8-s100.tar.gz.sha256 # 完整性校验
tar xzf qwen3.5-4b-ctx512-int8-s100.tar.gz转换方法论、验收协议、被拒绝的构建版本见 bllm-model-zoo。
已经有官方发布的 .hbm?用 bllm-make-model-dir 拼成模型目录即可,见
制作模型目录。
import bllm
llm = bllm.load("qwen3.5-4b-ctx512-int8-s100") # 目录,或 裸 .hbm + tokenizer_dir=
llm.set_sampling(temp=0.7, top_p=0.9) # 不设即贪心
for chunk in llm.stream_chat("用一句话介绍北京"): # 流式、多轮
print(chunk, end="", flush=True)
print(llm.last_decode_tps)C++:
#include "bllm/native_llm.h"
bllm::NativeLlm llm("/path/to/qwen2.5-1.5b");
std::string reply = llm.chat("你好", 400, [](const std::string& s){ std::cout << s << std::flush; });REPL:bllm_chat_native --model <dir>(见 examples/chat_native.cc)。
| 能力 | 一句话用法 | 示例 |
|---|---|---|
| 对话 / 流式 | llm.chat(...) · llm.stream_chat(...) |
chat_native.cc · native_session.py |
| 多轮与上下文 | 会话自持历史,llm.context_left 跟踪剩余额度 |
docs/API.zh.md |
| 采样 | llm.set_sampling(temp=…, top_p=…, …),可复现 |
采样参数速览 |
| 结构化输出 | llm.set_grammar("root ::= …") / JSON Schema |
docs/API.zh.md |
| 图文(VLM) | vlm.chat("描述这张图", images=["a.jpg"]) |
vlm_native.py · qwen35_native.cc |
| 文 / 图 / 音 / 视频 | Qwen2.5-Omni,路径或原始数组(相机/麦克风零拷贝) | vlm_native.cc |
| 文本嵌入 | NativeEmbedder(Qwen3-VL-Embedding;C++ API,暂无 Python 绑定) |
embed_native.cc |
| 服务化 | OpenAI 兼容 HTTP + Docker | docker/README.md |
| 与视觉共享 BPU | llm.set_bpu_priority(0) |
与视觉流水线共享 BPU |
一个模型是一个目录(.hbm + tokenizer.json + model.json 清单)。下载的官方模型
(.hbm 散在 model/、tokenizer 散在 config/)用 bllm-make-model-dir 拼成这个目录 ——
它随 bllm 包一起装好,不必 clone 本仓(等价形式:python -m bllm.make_model_dir;
源码树里是 scripts/make_model_dir.py):
R=<sdk>/oellm_runtime
bllm-make-model-dir dense ~/models/qwen2.5-1.5b \
--hbm $R/model/Qwen2.5_1.5B_Instruct_1024.hbm \
--tokenizer $R/config/Qwen2.5_1.5B_Instruct_config/tokenizer.json \
--cache-len 1024别手写 model.json —— 该工具会按权威性依次从 generation_config.json、
tokenizer 声明的 special token 解析停止符并打印用了哪个来源。猜错 eos 的下场是模型永不停:
Qwen2.5 的词表里就有一个 id 128247 的字面量 </s>,它并不是停止符。
三种 arch:dense(上面)、hybrid(Qwen3.5 SSM,另需 --embed)、
omni(多模态,另需塔与嵌入表)。官方包结构、ION 设置等完整部署步骤见
docs/MODELS.zh.md。
把运行时打包成 OpenAI 兼容的推理服务(/v1/chat/completions,流式 + 非流式),容器化部署在板上。
完整说明见 docker/README.md。
自包含镜像(模型烤进去,开箱即用) —— docker run 直接对话,无需挂载模型:
cd docker
./bake-model.sh ~/models/qwen3.5-2b bllm-serve:qwen3.5-2b-ctx512-int8-s100p
docker run -d --network host \
--device /dev/bpu --device /dev/bpu_core0 --device /dev/ion \
--device /dev/ipcdrv --device /dev/dcore0_rpmsg_bpu \
bllm-serve:qwen3.5-2b-ctx512-int8-s100p模型无关镜像(模型走 volume,一个镜像跑任意模型) —— 用 docker compose:
cd docker && ./stage-libs.sh
MODEL_DIR=~/models/qwen3.5-2b docker compose up -d --build服务默认监听 :8866,已开 CORS。用任意 OpenAI 兼容客户端指向 http://<板子IP>:8866/v1 即可
(chatbox-lite、桌面 Chatbox、Open WebUI、OpenAI SDK…):
curl localhost:8866/v1/chat/completions -H 'Content-Type: application/json' \
-d '{"messages":[{"role":"user","content":"你好"}]}'服务端会缓存对话前缀:OpenAI 协议无状态、客户端每轮重发全部历史,服务端只 prefill
新增部分。命中量在 usage.prompt_tokens_details.cached_tokens,整体统计看 GET /metrics。
匹配是逐 token 精确前缀比对,改了历史只会不命中并退化为全量 prefill,不会给出错答案。
板上实测:hybrid(Qwen3.5)31.6s → 1.3s(~25×),dense TTFT 274 → 141 ms。
一次只跑一个生成(单 BPU 图),排队超过 BLLM_MAX_QUEUE 返回 429。
详见 docker/README.md。
两条路:官方 Qwen2.5-Omni(文/图/音/视频),以及 Qwen3.5 图文(我们自己编的视觉塔)。
Qwen3.5 官方就是 image-text-to-text —— 纯文本的包只是编译时把视觉半边丢掉了。
同一个 hybrid 文本 .hbm 配上视觉塔即可(视觉塔离线转换,成品包直接可用):
bllm-make-model-dir hybrid ~/models/qwen3.5-0.8b-vlm448-ctx2k \
--hbm qwen35_0.8b_ctx2k.hbm --embed embed_fp16.bin --tokenizer tokenizer.json \
--visual qwen35_visual_448.hbm --hbm-prefill qwen35_prefill_n32.hbm \
--mrope-section 11 11 10 --mrope-interleaved \
--vision-patch 16 --vision-mean 0.5 --vision-std 0.5 --cache-len 2048vlm = bllm.load("~/models/qwen3.5-0.8b-vlm448-ctx4096-int8-s100p")
print(vlm.chat("Describe this image in one sentence.", images=["bears.jpg"]))
# -> Two brown bears walk across a dusty, arid landscape.
vlm.set_thinking(False) # 直接给答案,跳过 <think>...</think> 推理过程
m = bllm.load("~/models/qwen3.5-0.8b-vlm448-ctx4096-int8-s100p", vision=False)
print(m.chat("介绍一下你自己")) # 强制走纯文本会话,视觉塔权重完全不加载S100P 实测(0.8B,含分块 prefill 图):
| 桶 | token/图 | 塔输出 cosine vs HF fp32 | 首字延迟 |
|---|---|---|---|
| 320×320(更快,推荐) | 100 | 0.9987 | 1.23 s |
| 448×448 | 196 | 0.99654 | 2.30 s |
⚠️ 后四个参数必填且不能照抄 Omni(patch 16 vs 14、mean/std 0.5 vs CLIP、 rope 分段11 11 10vs16 24 24、频率布局 interleaved vs 连续)。编译好的.hbm里看不出这些,配错只会得到形状正确的垃圾。尤其--mrope-interleaved:t==h==w时两种布局完全等价,所以纯文本一切正常,只有喂进图像之后位置才开始错。
⚠️ 首字延迟的大头是把视觉行喂进文本模型,不是视觉塔(448 塔 encode 仅 0.36 s)。 分块 delta-rule 的 prefill 图(--hbm-prefill)把逐 token 摄入摊薄到秒级,分辨率越低越快。目前只支持静止图像:视频路径实现的是 Omni 的 TMRoPE,而 Qwen3.5 用时间戳 token 分隔帧,传
videos=会明确报错而不是悄悄编出顺序错乱的答案。
官方发布的 Omni 是三个塔 + 一张宿主嵌入表,先拼成一个模型目录
(bllm-make-model-dir 随 conda 包一起装好,不必 clone 本仓):
R=<sdk>/oellm_runtime
bllm-make-model-dir omni ~/models/qwen2.5-omni-3b \
--hbm $R/model/Qwen2.5_Omni_3B_Text.hbm \
--visual $R/model/Qwen2.5_Omni_3B_Visual.hbm \
--audio $R/model/Qwen2.5_Omni_3B_Audio.hbm \
--embed $R/model/embed_tokens.bin \
--mel-filters $R/config/Qwen2.5_Omni_3B_config/mel_filters_t.txt \
--tokenizer $R/config/Qwen2.5_Omni_3B_config/tokenizer.json \
--cache-len 2048
⚠️ embed_tokens.bin是 Omni 必需的,且极易漏下:它在官方下载清单里是单独一行 1.2 GB 的wget,躺在model/下,而且文件名不带 Omni 字样 —— 只下三个*_Omni_3B_*.hbm看着像下全了,其实缺它根本跑不起来(Omni 的嵌入表放在宿主侧, BPU 图吃的是 embedding 而非 token id)。
然后文本 + 图像 + 音频 + 视频,媒体可传文件路径或原始数组(HxWx3 uint8 帧、16 kHz 单声道 float PCM),
相机/麦克风流水线无需落盘:
vlm = bllm.load("/models/qwen2.5-omni-3b") # model.json 里 arch="omni"
for chunk in vlm.stream_chat("描述这张图片。", ["bus.jpg"]):
print(chunk, end="", flush=True)
vlm.reset(); vlm.chat("这段音频里说了什么?", audios=["clip.wav"])
vlm.reset(); vlm.chat("描述这段视频。", videos=[bllm.load_video("clip.mp4")])实时输入:边采集边把每 2 秒的分块编入 KV 缓存,提问时的首字延迟远低于离线:
vlm.stream_begin(fps=2.0)
while capturing:
vlm.stream_frame(frame_hwc_uint8) # 相机帧
vlm.stream_audio(pcm_float32) # 麦克风 16 kHz 单声道
print(vlm.stream_ask("刚才发生了什么?"))KV 窗口就是上下文,也是硬约束(vlm.context_left 跟踪剩余额度,越界会报错而非静默丢弃)。
官方 Visual.hbm 固定 448px = 256 token/frame-pair,配 2048 的 KV 窗口 ⇒ 视频只有约 8 秒 @2fps,
且这还没扣 prompt 和音频(音频另收 ~25 token/s);单张图片不受影响,一张图就是一次 256 token。
更低分辨率的塔能换来成比例的时长((size/14/2)²:336→144、224→64 token),但分辨率在离线导出时
就已定死,换塔要在 x86 上用 leap_llm 重新导出,不在本仓范围,官方也未发布别的塔。
完整部署步骤(dense 模型、ION 设置、官方包结构)见
docs/MODELS.zh.md,更多用法见 API 文档。
S100/S100P 单 BPU 核,LLM 与视觉(bcdl)会争用。一次解码是一个大图,默认会挡住同驻的检测器。
让检测器插队需要两个条件一起:.hbm 编译时设 max_time_per_fc(让调度器能在图内切换)
- 运行时把 LLM 优先级压低:
llm.set_bpu_priority(0) # 最低,让视觉抢占 BPU 队列实测(yolo26s vs Qwen2.5-1.5B 解码,检测器 p99):两个旋钮都开时检测器 p99 从 41 ms 降到 2.95 ms、 383 FPS,LLM 24→17 tok/s;空载时几乎不损耗。
板端实测(int8 权重,解码吞吐 / 首字延迟):
| 模型 | 板子 | 上下文 | 解码 |
|---|---|---|---|
| Qwen3.5-0.8B(混合 SSM) | S100P | 2048 | 22.5 tok/s |
| Qwen3.5-0.8B(混合 SSM) | S100P | 4096 | 19.5 tok/s |
| Qwen3.5-0.8B(混合 SSM,VLM) | S100P | 512 | 23.18 tok/s |
| Qwen3.5-0.8B(混合 SSM,VLM) | S100P | 4096 | 18.52 tok/s |
| Qwen3.5-2B(混合 SSM,VLM) | S100P | 512 | 15.29 tok/s |
| Qwen3.5-2B(混合 SSM,VLM) | S100P | 4096 | 13.20 tok/s |
| Qwen3.5-4B(混合 SSM,VLM) | S100P | 512 | 7.54 tok/s |
| Qwen3.5-4B(混合 SSM,VLM) | S100P | 4096 | 6.14 tok/s |
| Qwen2.5-1.5B(稠密) | S100P | 1024 | 约 24 tok/s |
| Qwen3.5-0.8B(混合 SSM) | S600(单核) | — | 42.7 tok/s |
| Qwen3.5-4B(混合 SSM) | S600(4 核并行) | — | 27 tok/s |
2B/4B 一行是本轮 GQA batched matmul + mask 去重重写后的实测(4B 相比重写前的
3.29 tok/s 提升近 2 倍——省下的主要是 expand_win 广播冗余的 DMA)。
首字延迟(含图像编码,S100P 实测):Qwen3.5-0.8B VLM 1.23 s(320px,ctx2048)/ 2.30 s(448px,ctx2048)/ 1.19 s(320px,ctx512)/ 1.32 s(320px,ctx4096); Qwen3.5-2B VLM 1.51 s(ctx512)/ 1.65 s(ctx4096); Qwen3.5-4B VLM 2.93 s(ctx512)/ 3.29 s(ctx4096)。 服务端命中对话前缀缓存后 hybrid 31.6 s → 1.3 s、dense TTFT 274 → 141 ms。
下列模型走同一条免配置路径(自动识别类型、发现对话模板、处理各家差异如 int8 KV), 在 q8/q4 × 上下文 1024/4096 等变体上验证。
D-Robotics 官方发布的 .hbm:
- Qwen2.5 1.5B / 7B(Base + Instruct)
- DeepSeek-R1-Distill-Qwen 1.5B / 7B
- InternLM2-1.8B
- Qwen2.5-Omni-3B(多模态)
本仓自行转换的 .hbm(官方工具链未覆盖的架构,由我们离线转换后在板上验证):
- Qwen3.5-0.8B / 2B / 4B(混合 SSM,BLLM 原生独有;100% 落 BPU int8)
- GLM-Edge · Phi-4-mini
模型转换(.hbm 如何产出)是离线流程,不在本仓范围;本仓消费成品 .hbm + tokenizer 配置。
预编译好的模型包见快速上手。
- 原生 BPU 推理:直接驱动
.hbm,跑在通用 hbDNN / hbUCP 栈上(和视觉共用同一 BPU 驱动)。 - 稠密 + 混合架构:Qwen2.5 / DeepSeek-R1-Distill / InternLM2 / GLM-Edge / Phi-4-mini 等稠密文本模型, 以及 Qwen3.5 混合 Gated-DeltaNet/SSM(严格 100% 落 BPU)。
- 多模态:Qwen2.5-Omni 的 文本 + 图像 + 音频 + 视频,以及 Qwen3.5 图文(自编视觉塔);支持文件路径或原始数组(相机/麦克风零拷贝)。
- 一行式会话:
bllm.load(...)/NativeSession,内置 C++ tokenizer、ChatML 模板、流式、多轮、采样。 - 完整采样:贪心 / 温度 / top-k / top-p / min-p / typical-p / 重复·频率·存在惩罚,可复现;
另有
logit_bias(强推/封禁 token)与logprobs(全词表精确对数概率)。 - 结构化输出:GBNF 语法约束解码 + JSON Schema → 语法。解码期只允许仍能满足语法的
token,所以
json.loads()不会失败——是保证,不是提示词里的请求。 - 文本嵌入:
NativeEmbedder(Qwen3-VL-Embedding,C++ API)—— 检索 / 相似度场景可直接用。 - 分块 prefill:混合模型的 prompt / 图像摄入走 seq_len=N 的 prefill 图, 比逐 token 摄入约快 76×(无 prefill 图的模型自动退回逐 token 路径)。
- 生产特性:困惑度、异步提交、提示缓存(KV+SSM 状态存取,逐位一致)、停止串(命中即停)、 与视觉流水线共享 BPU 的优先级/时间片控制。
多数用户直接 conda install bllm 即可(见快速上手)。想改源码/自行构建,则在板上
克隆并构建(运行时只在板上):
# 在 RDK S100 / S100P / S600 板上
git clone https://github.com/ruisv/bllm.git && cd bllm
# 构建依赖(示例,从我们的 conda 源)
conda install -c https://mirrors.ruis.ai/conda -c conda-forge \
cmake ninja cxx-compiler nlohmann_json hobot-dnn tokenizers-cpp nanobind numpy
scripts/build.sh --python # cmake + ninja;产物在 build/
export PYTHONPATH="$PWD/python" # 就地 import;或 scripts/build.sh --python --install一个 CMake 目标 bllm::native,只依赖板载通用 hobot 运行时(+ tokenizers-cpp 做字符串 I/O):
find_package(bllm REQUIRED)
target_link_libraries(app PRIVATE bllm::native)Python 里 import bllm 在有无扩展时都能导入;bllm.available_backends() 返回 ("native",) 或 ()。
| 文档 | 涵盖内容 |
|---|---|
docs/API.zh.md · docs/API.en.md |
Python API 参考 —— 会话、多模态、采样参数、服务化原语。 |
docs/CPP_API.zh.md · docs/CPP_API.en.md |
C++ API 参考 —— NativeLlm / NativeVlm / NativeEmbedder、语法约束、引擎层。 |
docs/MODELS.zh.md · docs/MODELS.en.md |
部署手册 —— 官方包结构、模型目录、ION 与性能模式。 |
docker/README.md |
服务化 —— OpenAI 兼容服务、镜像构建、前缀缓存与指标。 |
CONTRIBUTING.md |
如何搭建、构建(在板上)、测试并提交改动。 |
CHANGELOG.md |
发布说明(Keep a Changelog / SemVer)。 |
欢迎加入 BPU 技术交流群,一起讨论 RDK / BPU 端侧部署与本项目的使用(与 bcdl 共用同一社区群)。
微信群二维码有有效期,上面这张会在同一链接上原地更新;若扫码仍失效, 请在 Issues 留言,也欢迎直接在 Issues 交流。
欢迎贡献 —— issue 与 pull request 皆可。完整指南见 CONTRIBUTING.md;要点:
- 在任意机器开发,在板上构建与运行。 hobot 运行时只存在于 RDK 硬件上,所以 C++
库、Python 扩展和板端测试必须在 S100 / S100P / S600 上构建执行;纯元数据的单测
(
tests/test_modelmeta.py等)可在任意主机上跑。 - 约定 —— 头文件
.h、实现.cc,命名空间bllm,错误经BLLM_CHECK(...);与周围 代码风格保持一致。 - 测试 —— 行为变更需补测试:能离线跑的用元数据/路由单测钉死逻辑,涉及模型的补一个 板端端到端测试且模型缺失时干净跳过。
- 提交 —— 保持聚焦,遵循日志里已有的 Conventional Commits 风格。
- D-Robotics —— RDK S100 / S100P / S600 平台与 hobot 运行时(
hbDNN/hbUCP/HBRT),BLLM 构建于其上。 - nanobind —— Python 绑定层。
- mlc-ai/tokenizers-cpp + HuggingFace tokenizers —— C++ 分词。
- 所运行模型的上游作者 —— Qwen(Qwen2.5 / Qwen3.5 / Qwen2.5-Omni,阿里巴巴)、 DeepSeek、InternLM(上海人工智能实验室)、GLM(智谱)、Phi(微软)。 各权重受其各自上游许可证约束。
BLLM 以 Apache License 2.0 授权 —— 见 LICENSE。仅覆盖 BLLM 自身源码;
.hbm 模型权重受其各自上游许可证约束。
