llama2.c
是一个用纯 C 语言实现的轻量级推理引擎,无需依赖任何第三方库即可高效地进行推理任务。与 llama.cpp
相比,其代码更加直观易懂,并且可以在 PC、嵌入式 Linux 乃至 MCU 上部署。以下是 llama2.c
在 RK3576 开发板上的部署步骤。
工程克隆
首先我们将源码克隆下来:https://github.com/karpathy/llama2.c.git
PC端测试
在克隆完源码后,下载 TinyStories 数据集上训练的 15M 参数模型(大小约为 60MB):
wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin
然后编译并运行程序:
make run
./run stories15M.bin
运行结果如下:
可以看到,大概每秒能够生成64个token,速度非常快。
交叉编译
为了使程序能够在 OK3576 开发板上运行,需要对 Makefile
进行适当修改,以指定正确的交叉编译工具链路径。在 Makefile
中找到以下行:
我们需要将Makefile文件中的CC修改为我们之前设置过的交叉编译工具链。
GCC_COMPILER_PATH=${CROSS_COMPILE}
CC = ${GCC_COMPILER_PATH}gcc
确保 CC
变量正确设置了交叉编译器。接着,执行交叉编译:
make clean
make run
传输测试
完成交叉编译后,在当前目录下会产生一个可执行文件 run
。将 run
文件、stories15M.bin
模型文件及 tokenizer.bin
文件复制到开发板上。
执行结果如下:
在开发板上执行 run
命令后,可以观察到大约每秒生成 40 个 token 的速度,这也显示出较高的性能。
此外,在运行程序时,可以通过命令行参数来对模型的行为进行精细控制。以下是几个常用的参数及其作用:
-t <temperature>
:温度值。温度是用来控制模型输出的随机程度的一个参数。较高的温度值(如 1)会导致输出更加随机和不可预测,而较低的温度值(如 0.5)会使输出更加确定性和集中于高概率的选项。-s <seed>
:随机种子。这是一个用于初始化随机数生成器的整数值。设置相同的种子值可以使模型每次生成相同的序列,这对于调试和重现结果很有帮助。-i "<prompt>"
:输入提示。这是用来引导模型生成文本的初始字符串或句子。模型将基于提供的提示开始生成后续文本。确保提供的提示清晰明确,以便模型能够更好地理解和扩展。
通过这些参数,用户可以根据自己的需求调整模型的行为,从而获得更加符合预期的输出结果。