顺着ChatGPT的潮流,相信大家除了研究各种应用以外,对手搓AIGC模型是不是也很感兴趣。但是碍于囊中羞涩,没有机器,怎么体验手搓模型呢?不要怕,得益于开源社区的发展,现在想体验自建AIGC模型,只要零成本!没错,就是零成本!只要有办公电脑和手就可以了!
“零成本”的准备
虽说是零成本,但是还需要有一定的准备的:
1、需要一台Mac电脑或者Linux服务器
2、电脑安装了Python3.9或者以上的版本
3、了解GPT模型的基本原理,理解为什么训练或者微调出来的模型,只能做到“接龙”的能力,可以参考我之前写的这个文章:https://developer.aliyun.com/article/1191601?spm=a2c6h.13148508.setting.14.1d604f0eVR1TyR
训练模型-NanoGPT
地址:https://github.com/karpathy/nanoGPT
NanoGPT可以说是体验手搓模型的最好的入门工程,可以在感官上感觉一下如何手搓模型。
1、checkout 代码
git clone https://github.com/karpathy/nanoGPT.git
2、安装依赖
pip install pytorch pip install numpy pip install transformers pip install datasets pip install tiktoken pip install wandb pip install tqdm
3、准备数据
这一步是为了把数据分割处理,这里用了莎士比亚的一个文集,大概1MB。把文集切割成几万个字符。
python data/shakespeare_char/prepare.py
4、训练命令(以单机Macbook来举例子)
关键参数是需要把--device设置为cpu
python train.py config/train_shakespeare_char.py --device=cpu --compile=False --eval_iters=20--log_interval=1--block_size=64--batch_size=12--n_layer=4--n_head=4--n_embd=128--max_iters=2000--lr_decay_iters=2000--dropout=0.0
这里设置的iters为2000,所以总共会经历2000轮的迭代,loss会一直减少。根据你的机器配置,会有不同的时间,我的破Mac需要跑接近2小时才能跑完。
5、测试效果
经历过久久的等待,当跑完2000个迭代以后,就会在out-shakespeare-char里面生成一个文件(实际上是在训练过程中不断更新这个文件)。
如果需要在Mac上测试效果,需要先修改sample.py文件,把device = 'cuda'改成device = 'cpu'。然后使用下面的命令来测试,原理是模型会按照莎士比亚文集的学习,来模拟字符的接龙。你还可以通过--start命令指定接龙的开头。
python sample.py --out_dir=out-shakespeare-char python sample.py --out_dir=out-shakespeare-char --start="To be or not to be"python sample.py --out_dir=out-shakespeare-char --start="Your tale, sir"
效果大概是这样的:
只能说,他真的接龙了,好像真的有那么一回事,但是云里雾里。毕竟是1MB的训练集嘛,要理解机器。
微调模型-NanoGPT
还是基于https://github.com/karpathy/nanoGPT
Finetune也叫做微调,是说在一个成熟的模型上,给他训练我们想要他学习的东西。这个项目引入了GPT-2的模型做微调,虽然GPT-2在现在来说比较落后的模型,但是最小的GPT-2模型,也有1.24亿个参数,是非常大的模型。实测我的破笔记本是做不到(或者说做得到但loss一直不理想)。但也不是不能尝试,下面是强行在Mac上运行微调的命令。
1、准备数据
python data/shakespeare/prepare.py
2、微调
实测下面的参数比较不容易爆内存,但如果你的电脑内存比较大,可以考虑调整下参数
python train.py config/finetune_shakespeare.py --device=cpu --compile=False --eval_iters=20--log_interval=1--block_size=64--batch_size=12--n_layer=4--n_head=4--n_embd=128--max_iters=2000--lr_decay_iters=2000--dropout=0.0
如果你有GPU服务器,比如有一个T4,这样就轻松很多。(这个命令不是最优的,内存只使用了4GB)
python train.py config/finetune_shakespeare.py --eval_iters=20--log_interval=1--block_size=64--batch_size=12--n_layer=4--n_head=4--n_embd=128--max_iters=1000--lr_decay_iters=1000--dropout=0.0
运行1000或者2000个迭代后,就会在out-shakespeare里面生成一个文件夹,存放结果。
3、查看结果
python sample.py --out_dir=out-shakespeare --start='To be or not to be'
基于GPT-2进行莎士比亚文集的微调后,明显感觉接龙的质量高了很多。感觉前后文有一定的逻辑了。
运行模型-pyllama
上面自己训练出来的模型都太傻了,只能接着你说的话进行接龙。那么有没有一个模型可以直接对话的呢?当然有啦。
LLaMA模型是Meta开源的大语言模型,宣称已经达到了GPT-3的水平。由于是开源的,所以是拿来运行的好模型。但是LLaMA本身有一个比较大的问题,就是下载模型需要填表等回复邮件。实测他一般是不会给你回复的。所以下载LLaMA模型最好的方法还是下载其社区版。
而工程pyllama就把下载模型和运行模型这些工作都打包好了,这就是我们零成本体验的最好工程。
地址:https://github.com/juncongmoo/pyllama
(因为我的Mac配置实在不行,下面的命令都以单GPU的服务器为例子,在其他人的Mac上实测其实也是可以运行起来的)
1、安装依赖
pip install pyllama -U
2、下载模型
下载最小的7B为例子
python -m llama.download --model_size 7B
模型会被下载到当前目录./pyllama_data/这里
3、运行模型
python inference.py --ckpt_dir ./pyllama_data/7B --tokenizer_path ./pyllama_data/tokenizer.model
效果大概是这样子
4、网页版运行
python ./app/gradio/webapp_single.py --ckpt_dir ./pyllama_data/7B --tokenizer_path ./pyllama_data/tokenizer.model
效果大概是这样子。
总结
上面的这些过程,算是带大家体验一把训练模型的快感,在体感上感觉下AIGC模型的原理和训练微调过程。但是很显然,这些东西并不具备任何实际作用。训练出来的模型都太基础或者太落后了,但是可以初步形成模型的一些概念。而“零成本”也是一个噱头,实测下来NanoGPT的话我的Mac还能应付, LLaMA运行的话还是需要比较高配置的Mac的,但如果想进一步对LLaMA进行处理,Mac肯定是做不到的了。
比如LLaMA对中文支持非常差,实际上还有一些融合中文训练语料的工程,那种工程的话,就不是Mac可以体验的了,就彻底不是“零成本”不在这篇文章的讨论范围。下一篇可以讲讲中文LLaMA和它的微调。