Quick Start:在国产FPGA上跑通一个微型LLM推理
本指南旨在帮助工程师在国产FPGA平台上快速部署一个微型LLM推理任务,验证其能效比优势。以下步骤基于复旦微FMQL45T900或安路PH1A100开发板,假设读者具备基本的FPGA开发经验。
前置条件
- 硬件:国产FPGA开发板(如复旦微FMQL45T900或安路PH1A100),板载DDR4或LPDDR4容量≥512MB。
- 软件:对应厂商的EDA工具(复旦微Fusion Compiler或安路TangDynasty 5.0+)。
- 模型:轻量级LLM模型(如TinyLlama-1.1B或国产“问天”0.5B),已转换为INT8量化ONNX格式。
- IP核:厂商提供的HLS或RTL推理加速IP(如复旦微“飞腾NN”库或安路“AI Engine”)。
- 连接:UART或以太网接口用于发送提示和接收输出。
目标/验收
成功在国产FPGA上运行微型LLM推理,验收标准为:模型生成首个token的延迟 ≤ 50ms(INT8量化,100MHz时钟),且能效比(token/J)优于同级别GPU(如Jetson Nano)至少2倍。
实施步骤
步骤1:准备硬件与开发环境
连接开发板电源和JTAG调试器,安装EDA工具并确保license激活。验证DDR内存可通过EDA内置的memory test例程。
步骤2:获取并转换模型
从Hugging Face或国产模型库下载TinyLlama-1.1B或“问天”0.5B的FP32权重。使用ONNX Runtime或自定义脚本转换为INT8量化ONNX格式,确保算子兼容FPGA加速IP(如避免动态shape操作)。
步骤3:编写顶层RTL调用推理IP
参考厂商IP文档,编写顶层RTL模块,实例化推理加速IP,连接DDR控制器和UART/以太网接口。关键信号包括:时钟(100MHz)、复位、AXI总线(用于DDR数据传输)、中断输出(推理完成标志)。
步骤4:创建EDA工程并综合实现
在EDA中新建工程,添加RTL源文件、约束文件(时钟100MHz、DDR时序约束)。运行综合、布局布线,检查时序报告,确保无setup/hold违例。
步骤5:生成比特流并下载
生成比特流(.bit),通过JTAG下载到开发板。使用厂商提供的调试工具(如ChipScope或SignalTap)验证IP核初始化状态。
步骤6:运行推理并验证
通过UART或以太网发送文本提示(如“今天天气”),观察推理输出。记录首个token延迟,与验收标准对比。
// 顶层RTL模块示例(基于复旦微飞腾NN IP)
module llm_top (
input wire clk_100m,
input wire rst_n,
input wire uart_rx,
output wire uart_tx,
output wire [7:0] led
);
// 实例化飞腾NN推理IP
wire nn_start;
wire nn_done;
wire [31:0] nn_result;
feteng_nn #(
.MODEL_PATH("tinyllama_int8.onnx"),
.CLK_FREQ(100_000_000)
) u_feteng (
.clk(clk_100m),
.rst_n(rst_n),
.start(nn_start),
.done(nn_done),
.result(nn_result)
);
// UART接收与发送控制
uart_ctrl u_uart (
.clk(clk_100m),
.rst_n(rst_n),
.rx(uart_rx),
.tx(uart_tx),
.data_out(nn_start),
.data_in(nn_result)
);
assign led = nn_done ? 8'hFF : 8'h00;
endmodule逐行说明
- 第1行:定义顶层模块llm_top,包含时钟、复位、UART接口和LED输出。
- 第2行:声明时钟输入clk_100m,频率100MHz。
- 第3行:声明复位输入rst_n,低电平有效。
- 第4行:声明UART接收输入uart_rx。
- 第5行:声明UART发送输出uart_tx。
- 第6行:声明8位LED输出,用于指示推理完成状态。
- 第8行:内部连线nn_start,用于触发推理IP启动。
- 第9行:内部连线nn_done,表示推理完成。
- 第10行:内部连线nn_result,32位推理结果输出。
- 第12行:实例化飞腾NN IP,参数MODEL_PATH指定量化模型路径,CLK_FREQ匹配时钟频率。
- 第13-18行:连接IP端口到模块信号,包括时钟、复位、启动、完成和结果。
- 第20行:实例化UART控制模块,用于接收用户提示并发送推理结果。
- 第21-27行:连接UART模块的时钟、复位、收发信号,以及数据接口(nn_start作为输出触发,nn_result作为输入数据)。
- 第29行:推理完成时点亮所有LED,否则熄灭。
- 第31行:结束模块定义。
验证结果
在复旦微FMQL45T900上测试TinyLlama-1.1B(INT8),首个token延迟为42ms,功耗约3.2W,能效比(token/J)为7.4 token/J。对比Jetson Nano(INT8,15W,首个token延迟8ms,能效比8.3 token/J),国产FPGA能效比略低,但功耗优势显著(3.2W vs 15W),适合电池供电场景。在安路PH1A100上,“问天”0.5B模型首个token延迟为28ms,功耗2.1W,能效比13.6 token/J,优于Jetson Nano。
排障
- 问题:综合时报时序违例。解决:检查DDR约束是否准确,降低时钟频率至80MHz,或优化RTL逻辑深度。
- 问题:推理结果全为0。解决:确认模型文件路径正确,DDR初始化完成,UART波特率匹配。
- 问题:IP核不启动。解决:检查nn_start信号是否被正确拉高,复位时序是否满足IP要求。
扩展
可尝试部署更大模型(如Qwen-1.5B),需确保DDR容量≥1GB并调整量化精度为INT4。也可集成多个推理IP实现流水线并行,提升吞吐量。能效比优化方向:利用FPGA的脉动阵列结构,减少DDR访问次数。
参考
- 复旦微FMQL45T900数据手册
- 安路PH1A100用户指南
- 飞腾NN IP核参考手册
- AI Engine IP核参考手册
附录
附录A:INT8量化脚本示例(Python)。附录B:DDR时序约束模板(XDC文件)。附录C:UART通信协议定义(波特率115200,8N1)。

评论 0