Thinker 离线翻译示例
功能说明
本示例在 ARCS AP Core 上运行 Thinker Transformer Encoder/Decoder,将固定的英文 句子离线翻译为中文。示例复用一块 PSRAM 模型缓冲区依次运行 Encoder 和 Decoder,并从外部 Flash 直接查询紧凑词表,不依赖网络或 Host 侧 Python 环境。
硬件连接
无需外部连接,Thinker、Luna、PSRAM 和外部 NOR Flash 均为开发板资源。示例支持
arcs_evb 和 arcs_mini,两种板型都搭载带 16 MiB PSRAM 的 LS2684。
示例步骤
从词表资源查找英文单词 ID,生成不超过 32 个词元的 Encoder 输入。
从 Flash 加载
arcs_encoder.bin到 PSRAM,运行 Encoder 并保存int8 [1, en_len, 256]memory tensor。释放 Encoder 后复用模型缓冲区,加载
arcs_decoder.bin。Decoder 使用贪婪搜索逐个生成中文词元,遇到 EOS 或达到 32 个词元时结束。
Decoder 每步同时传入
int8 [1, 8, de_len, de_len]因果掩码,防止注意力读取未来词元。将中文词元拼接后输出到日志。
资源布局
应用和三个运行资源需要分别烧录:
资源 |
Flash 偏移 |
默认 XIP 地址 |
大小 |
|---|---|---|---|
|
|
|
不超过 1 MiB |
|
|
|
|
|
|
|
|
|
|
|
|
编译
重要提示:编译前需要先确认当前示例支持的目标板型,然后将板型标识传给 -DBOARD。请按以下方式选择:
确认示例限制:查看当前示例
README中的硬件连接和注意事项,确认是否限定板型。参考示例配置:查看相关示例目录下的
sample.yaml,确认支持的板型。填写板型标识:SDK 内置板型的标识为
boards/下的目录名。例如实际使用的板型目录为boards/<板型名称>/,则编译参数填写为-DBOARD=<板型名称>。
在 SDK 根目录执行编译,并将命令中的 <示例路径> 和 <板型名称> 替换为实际值。
Linux 使用 build.sh:
# 通用命令
./build.sh -C -S samples/<示例路径> -DBOARD=<板型名称>
# 示例:使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
Windows PowerShell 使用 build.ps1:
# 通用命令
.\build.ps1 -C -S samples/<示例路径> -DBOARD=<板型名称>
# 示例:使用 arcs_evb 开发板
.\build.ps1 -C -S samples/<示例路径> -DBOARD=arcs_evb
Note
确保已安装对应平台的工具链和 ListenAI 开发工具包。Windows 环境请先执行 .\env.ps1 或直接使用 .\build.ps1 自动加载环境。
注意事项:-DBOARD 填写的是板型标识,不是芯片系列名称。如果示例有板型专用配置或额外编译参数,以示例 README 中的说明为准。
烧录
先烧录应用,再烧录 Encoder、Decoder 和词表资源:
cskburn -C arcs -s /dev/ttyACM0 -b 3000000 \
0x0 build/lnn_thinker_translation.bin \
0x100000 build/arcs_encoder.bin \
0x800000 build/arcs_decoder.bin \
0xE80000 build/translation_vocab.bin
构建时 CMake 会把三个 resources/ 文件复制到构建目录。烧录完成后设备自动
复位;日志串口波特率为 921600。
预期输出
[I][thinker_translation] translation input: May the Force be with you.
[I][translation_vocab] vocabulary ready: source=15080 target=4362 size=245345
[I][offline_translation] encoder forward cost: ... ms
[I][offline_translation] decoder forward total cost: ... ms steps=9
[I][thinker_translation] translation result: 愿力量与你同在。
模型使用与 ARCS Thinker 3.0.10 LayerNorm 实现一致的 Q10 归一化尺度。 Encoder 和 Decoder 在打包前已通过 Linger ONNXRunner/Thinker 逐层一致性验证, 默认句子的 x86 Thinker 与实板都应输出上述翻译。
配置说明
待翻译英文句子由 src/main.c 中的 s_translation_sentence 设置。板端预处理与
训练工程保持一致,会先转为小写、删除最后一个字符再按空白分词,因此句子必须以
标点结尾,且加上 BOS/EOS 后不能超过 32 个词元。
模型地址、大小和运行内存池由以下配置控制:
CONFIG_THINKER_TRANSLATION_ENCODER_MODEL_ADDR=0x30100000
CONFIG_THINKER_TRANSLATION_ENCODER_MODEL_SIZE=0x6CC060
CONFIG_THINKER_TRANSLATION_DECODER_MODEL_ADDR=0x30800000
CONFIG_THINKER_TRANSLATION_DECODER_MODEL_SIZE=0x650160
CONFIG_THINKER_TRANSLATION_VOCAB_ADDR=0x30E80000
CONFIG_THINKER_TRANSLATION_VOCAB_SIZE=0x3BE61
CONFIG_THINKER_TRANSLATION_PSRAM_POOL_SIZE=0x20000
CONFIG_THINKER_TRANSLATION_SHARE_POOL_SIZE=0x60000
核心 API
API |
说明 |
|---|---|
|
获取当前 Encoder 或 Decoder 的运行内存计划。 |
|
从 PSRAM 中的 Thinker 模型资源创建模型。 |
|
创建当前模型执行器。 |
|
设置词元 ID、Encoder memory tensor 或 Decoder 因果掩码,并写入实际输入维度。 |
|
设置全部输入后,根据输入 Tensor 推导动态 Shape。 |
|
执行一次 Encoder 或 Decoder 推理。 |
|
读取 Encoder memory tensor 或 Decoder 概率张量。 |
词表重新生成
如果训练侧 vocab.json 发生变化,使用脚本重新生成紧凑词表:
labs/lnn/thinker_translation/scripts/generate_vocab.py \
/path/to/vocab.json \
labs/lnn/thinker_translation/resources/translation_vocab.bin
生成后必须同步更新 CONFIG_THINKER_TRANSLATION_VOCAB_SIZE,并确保模型的英文、
中文词表大小仍分别为 15080 和 4362。
注意事项
资源必须配套:两个 Thinker 模型和词表来自同一次训练/转换结果,不能单独替换。
Flash 容量:默认布局占用约 14.8 MiB,只适用于至少 16 MiB NOR Flash 的板卡。
PSRAM 复用:Encoder 和 Decoder 不能同时驻留;修改代码时要保留先释放再加载的顺序。
量化输出:Decoder 输出为
int8 [1, de_len, 4362],每步直接对量化分数取最大值。词表校验:板端启动时会检查词表头、尺寸、词表项数量和 payload CRC32。