llama2 纯萌新笔记 其一 “跑起来再说”
最近几年机器学习概念随着 stable diffusion 以及大语言模型变得流行起来,似乎到了有必要去了解一下的时候了。作为一个后端工程师,我除了 Python 之外对相关概念基本没有多少了解,只看过一些科普性质的关于机器学习的介绍。
Meta 的 llama2 这几天开源出来了,并且内部训练的模型权重也可以开放商业使用,准备尝试在本地运行,记录一下折腾过程。
首先要说明的是,运行 llama2 有多种不同的方式,只要使用 meta 放出来的模型权重文件就可以。这里先尝试直接用 meta 官方的实现来测试,按照 meta 的说法,这只是个最简单的实现,基于 pytorch。
获取代码已经安装依赖
首先第一步就是 clone 相关代码,位于:https://github.com/facebookresearch/llama 。clone 下来之后看项目结构,非常简单,其中的 setup.py 基本什么也没写,主要就是把 requirements.txt 里的依赖放了过来,版本也没要求。
那看来安装依赖就很简单了,只要创建好虚拟环境,直接运行 pip install -r requirements.txt
就可以。因为我的显卡 AMD 6800 在 pytorch 显卡加速的支持列表里,所以需要安装 rocm 版本的 pytorch,基于 pytorch 官网,只需要额外制定 pypi index server 的地址就可以。
获取模型
模型获取麻烦一些,因为 meta 虽然允许 llama2 商用,但是需要接受一系列协议才可以使用,所以没有直接提供下载连接,防止有部分人不遵守协议使用,带来不必要的麻烦。现在想要下载模型,需要见进行申请。根据 llamma 项目的 readme 来进行申请即可。目前申请非常快,基本申请完毕过几分钟通过的邮件就来了。
但是因为一些众所周知的原因,把模型权重文件下载回来还是比较麻烦的。meta 除了自己 host 了下载连接之外,也把模型权重文件上传到了 huggingface,huggingface 的文件下载服务器在全球都有 CDN,并且可以直连,我直接通过 huggingface 来下载了权重文件。需要注意的是,从 huggingface 下载的时候也需要登录邮箱申请并通过过。
如果想使用 meta 自己的下载服务器,运行项目源码里的 download.sh,输入邮箱中获取到的下载链接,即可下载。
运行
获取到模型,就可以尝试运行了。首先尝试运行官方提供的两个例子:
example_text_completion.py
:一个以文本补全为主要工作的例子,也就是用户提供一段未完成的文字,交给 llama 去续写;example_chat_completion.py
:对话式的交互,用户提供提问,llama 回答,类似 chatgpt 的形式。
不过其实这两者本质没有什么不同,都是 llama 来进行续写,只不过后者遵循某种特定形式,即用户提供问题,llama 提供回答。同时 meta 在 huggingface 上提供了针对对话形式优化过的模型,在训练的时候提供了更多对话形式的数据,能保证提供的效果更好。
我下载的普通版本,因此直接测试 example_text_completion.py
就可以。其实运行 example_chat_completion.py
也没有问题,只不过效果不太好。
meta 提供的运行命令是 torchrun example_text_completion.py --ckpt_dir llama-2-7b/ --tokenizer_path tokenizer.model--max_seq_len 128 --max_batch_size 4
,不过其中有价值的只是 --ckpt_dir
和 --tokenizer_path
,分别代表 llama 模型权重所在文件夹路径和分词器模型文件路径,剩下两个其实和默认参数一样。
如果一切顺利,可以看到结果。
提出自己的问题
打开 example_chat_completion.py
可以看到,代码逻辑非常简单,就是把代码中定义的 prompts
里的每一个字符串丢给 llama,将返回结果打印出来。因此想向 llama 提自己的问题,只需要修改 prompts
即可。
修改成如下内容:
prompts = [
"The manga Dragon Ball tells a story about ",
]
重新运行,得到结果:
❯ torchrun example_text_completion.py \
--ckpt_dir llama-2-7b/ \
--tokenizer_path tokenizer.model \
--max_seq_len 128 --max_batch_size 4
> initializing model parallel with size 1
> initializing ddp with size 1
> initializing pipeline with size 1
Loaded in 15.81 seconds
The manga Dragon Ball tells a story about
> 12-year-old Goku, who lives in a remote village in the mountains of China. The boy has an extraordinary ability, which is not surprising, since he is the son of the great warrior Bardock. One day, the boy meets a mysterious stranger named Bulma, who is looking
==================================