当前位置:AIGC资讯 > AIGC > 正文

【wails】(8):发现一个用golang重写llama.cpp的llama.go项目,经测试支持f32模型,半年未更新,找到llama.cpp对应的版本,可以转换f32模型

1,项目地址

https://github.com/gotzmann/llama.go

项目最后的发布时间是2023年4月28日
项目是把 llama.cpp 的项目重写使用 golang 重写了下。

https://www.bilibili.com/video/BV1ru4m1c7NM/

【wails】(8):发现一个用golang重写llama.cpp的llama.go项目,经测试支持f32模型,半年未更新,找到llama.cpp对应的版本

已经完成的功能:

V0 路线图
使用纯Go实现张量数学
实现并加载LLaMA神经网络架构
使用较小的LLaMA-7B模型进行测试
确保Go推理的方式与C++完全相同
让Go发挥优势!启用多线程和消息传递以提高性能

V1 路线图 - 2023年春
跨平台兼容性:Mac、Linux和Windows
为机器学习发布第一个稳定版本 - v1.0
支持更大的LLaMA模型:13B、30B、65B - v1.1
在Apple(Mac电脑)和ARM服务器上支持ARM NEON - v1.2
为英特尔和AMD的x64 AVX2支持提供性能提升 - v1.2
更好的内存使用和垃圾回收优化 - v1.3
引入服务器模式(嵌入式REST API)以便在实际项目中使用 - v1.4
通过互联网免费提供转换后的模型 - v1.4

2,找到模型文件并使用llama-dl下载

经过研究,发现需要下载 llama 的模型,使用的是 download 的脚本。

项目代码在:
https://github.com/shawwn/llama-dl

下载完成后其实 tokenizer.model 和 tokenizer_checklist.chk 文件是在 根目录。

然后模型放到了 7B 13B 30B 65B 下面。

当然也有使用 python 脚本的实现:

https://github.com/cornelk/llama-go/blob/go/download-pth.py

download-pth.py 但是这个项目不是用纯 golang 写的。

3,转换模型成f32格式

特别依赖版本,因为代码有很长的时间没有更新了。
所以使用 最新的版本并不能执行。

需要切换到相关的版本,找到 llama.cpp 的版本:

找到和 llama.go 项目相同时间发布的版本:

发现head中的信息一致,llama.cpp 版本:

#define LLAMA_FILE_VERSION 1
#define LLAMA_FILE_MAGIC 0x67676a74 // 'ggjt' in hex
#define LLAMA_FILE_MAGIC_UNVERSIONED 0x67676d6c // pre-versioned files

llama.go 定义的版本信息:

const (
	LLAMA_FILE_VERSION           = 1
	LLAMA_FILE_MAGIC             = 0x67676a74 // 'ggjt' in hex
	LLAMA_FILE_MAGIC_OLD         = 0x67676d66 // 'ggmf' in hex
	LLAMA_FILE_MAGIC_UNVERSIONED = 0x67676d6c // 'ggml' pre-versioned files
)

只有是一样的版本信息,使用代码生成的 ggml 模型文件才可以使用。

然后编译 llama.cpp 代码使用工具进行转换:

# 生成 f32 的模型:

python3 convert-pth-to-ggml.py /root/autodl-tmp/models/7B 0

然后对模型进行量化:
./quantize /root/autodl-tmp/models/7B/ggml-model-f32.bin \
 /root/autodl-tmp/models/7B/ggml-model-q4_0.bin 2

4,然后再编译、运行 llama.go 项目,只支持f32模型

进入到 llama.go 项目中执行:


cd /usr/local/
wget https://golang.google.cn/dl/go1.22.0.linux-amd64.tar.gz
export GOROOT=/usr/local/go
export PATH="$PATH:$GOPATH/bin:$GOROOT/bin"

go env -w GOPROXY=https://goproxy.cn,direct

然后克隆项目进行编译:

# 克隆项目:
git clone https://github.com/gotzmann/llama.go.git

# 然后进入 
cd llama.go/
 
make build

./llama --model /root/autodl-tmp/models/7B/ggml-model-f32.bin --pods 6 --threads 6 --prompt "Why Golang is so popular?"

执行结果:


[ PROMPT ] Why Golang is so popular?
[ OUTPUT ]
Why Golang is so popular?
I have been using Go for a while now, and I am very impressed by the language. It has many features that make it easy to use and write code in. The syntax is simple, concise, and expressive. It also has some great tools like gofmt, goimports, and go vet.
Go is an open source programming language developed at Google. Its design emphasizes simplicity, safety, and productivity. It has a clean, modern C-like syntax with static typing, garbage collection, interfaces, and modules.
The Go Programming Language is free software released under the BSD license. 
......
 
[ HALT ] Time per token: 2720 ms | Tokens per second: 0.37

5,总结

golang 的代码可以执行 f32 的模型,但是不能执行 f16 和 int4 的模型。
这部分工作并没有开发完成。
因为模型 有 26G 所以使用 CPU 执行速度并不快,有 0.37 tokens/s 。

项目目前看已经 10 个月没有更新了。
从代码量看,确实都不算太多。可以研究研究里面的算法。

更新时间 2024-03-27