安装完成后,建议进入Python命令行测试一下,下面是个样例
(base) PS C:\Users\alion> conda activate fastchat
(fastchat) PS C:\Users\alion> python
Python 3.9.16 (main, Mar 8 2023, 10:39:24) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.__version__)
1.13.1+cu116
>>> print(torch.version.cuda)
>>> exit()
(fastchat) PS C:\Users\alion>
(fastchat) C:\Users\alion>pip3 install fschat
Collecting fschat
Downloading fschat-0.2.3-py3-none-any.whl (79 kB)
---------------------------------------- 80.0/80.0 kB 371.0 kB/s eta 0:00:00
Collecting accelerate (from fschat)
Using cached accelerate-0.18.0-py3-none-any.whl (215 kB)
Collecting fastapi (from fschat)
Using cached fastapi-0.95.1-py3-none-any.whl (56 kB)
Collecting gradio==3.23 (from fschat)
Using cached gradio-3.23.0-py3-none-any.whl (15.8 MB)
......
Collecting pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 (from jsonschema>=3.0->altair>=4.2.0->gradio==3.23->fschat)
Using cached pyrsistent-0.19.3-cp39-cp39-win_amd64.whl (62 kB)
Collecting uc-micro-py (from linkify-it-py<3,>=1->markdown-it-py[linkify]>=2.0.0->gradio==3.23->fschat)
Using cached uc_micro_py-1.0.1-py3-none-any.whl (6.2 kB)
Installing collected packages: wcwidth, tokenizers, sentencepiece, pytz, pydub, pathtools, ffmpy, appdirs, zipp, websockets, uc-micro-py, tzdata, toolz, svgwrite, sniffio, smmap, six, shortuuid, setproctitle, sentry-sdk, semantic-version, regex, pyyaml, python-multipart, pyrsistent, pyparsing, pygments, pydantic, psutil, protobuf, prompt-toolkit, packaging, orjson, multidict, mdurl, markupsafe, markdown2, kiwisolver, h11, fsspec, frozenlist, fonttools, filelock, entrypoints, cycler, contourpy, colorama, attrs, async-timeout, aiofiles, yarl, wavedrom, tqdm, python-dateutil, markdown-it-py, linkify-it-py, jsonschema, jinja2, importlib-resources, gitdb, docker-pycreds, click, anyio, aiosignal, accelerate, uvicorn, starlette, rich, pandas, mdit-py-plugins, matplotlib, huggingface-hub, httpcore, GitPython, aiohttp, wandb, transformers, httpx, fastapi, altair, gradio, fschat
Successfully installed GitPython-3.1.31 accelerate-0.18.0 aiofiles-23.1.0 aiohttp-3.8.4 aiosignal-1.3.1 altair-4.2.2 anyio-3.6.2 appdirs-1.4.4 async-timeout-4.0.2 attrs-23.1.0 click-8.1.3 colorama-0.4.6 contourpy-1.0.7 cycler-0.11.0 docker-pycreds-0.4.0 entrypoints-0.4 fastapi-0.95.1 ffmpy-0.3.0 filelock-3.12.0 fonttools-4.39.3 frozenlist-1.3.3 fschat-0.2.3 fsspec-2023.4.0 gitdb-4.0.10 gradio-3.23.0 h11-0.14.0 httpcore-0.17.0 httpx-0.24.0 huggingface-hub-0.13.4 importlib-resources-5.12.0 jinja2-3.1.2 jsonschema-4.17.3 kiwisolver-1.4.4 linkify-it-py-2.0.0 markdown-it-py-2.2.0 markdown2-2.4.8 markupsafe-2.1.2 matplotlib-3.7.1 mdit-py-plugins-0.3.3 mdurl-0.1.2 multidict-6.0.4 orjson-3.8.10 packaging-23.1 pandas-2.0.0 pathtools-0.1.2 prompt-toolkit-3.0.38 protobuf-4.22.3 psutil-5.9.5 pydantic-1.10.7 pydub-0.25.1 pygments-2.15.1 pyparsing-3.0.9 pyrsistent-0.19.3 python-dateutil-2.8.2 python-multipart-0.0.6 pytz-2023.3 pyyaml-6.0 regex-2023.3.23 rich-13.3.4 semantic-version-2.10.0 sentencepiece-0.1.98 sentry-sdk-1.20.0 setproctitle-1.3.2 shortuuid-1.0.11 six-1.16.0 smmap-5.0.0 sniffio-1.3.0 starlette-0.26.1 svgwrite-1.4.3 tokenizers-0.13.3 toolz-0.12.0 tqdm-4.65.0 transformers-4.28.1 tzdata-2023.3 uc-micro-py-1.0.1 uvicorn-0.21.1 wandb-0.15.0 wavedrom-2.0.3.post3 wcwidth-0.2.6 websockets-11.0.2 yarl-1.8.2 zipp-3.15.0
(fastchat) C:\Users\alion>
- 由于FastChat基于LLaMA做的二次调参训练,所以我们需要先拿到LLaMA模型文件
- 官方的获取方式比较麻烦,需要你先填个表单,然后等他们回复,认为可以了才会给你文件
- 不过幸运的是,国内有人共享了 LLaMA模型文件
- 下载后,关于解压或是保存文件的路径中 ,请记得不要有中文、特殊符号等
- 接下来,我们还需要转换一下LLaMA的文件,以便于构建FastChat对应的模型Vicuna(我资源不够,用的7B模型)
- 下载 huggingface/transformers 的源码,访问其GitHub地址
- 点击绿色的Code按钮,选择Download ZIP,完成代码下载
- 解压,进入到项目下
$ cd transformers-main
- 利用 huggingface/transformers 中的代码,完成对于LLaMA的转换,示例
$ python src/transformers/models/llama/convert_llama_weights_to_hf.py --input_dir D:/code/model/LLaMA --model_size 7B --output_dir D:/code/model/transformer_model_7b
- 参数:
--input_dir
指定的是刚才你下载好的LLaMA文件地址,这个路径下有个tokenizer.model
文件,请仔细核对一下 - 参数:
--model_size
指定用哪个参数数量级的模型,7B
代表的是70亿个参数的那个模型(如果你用的种子链接下载的话,还有13B/30B/65B的模型) - 参数:
--output_dir
是转换后输出的路径,等下要用
- 输出信息样例如下
(fastchat) D:\code\transformers-main>python src/transformers/models/llama/convert_llama_weights_to_hf.py --input_dir D:/code/model/LLaMA --model_size 7B --output_dir D:/code/model/transformer_model_7b
Fetching all parameters from the checkpoint at D:/code/model/LLaMA\7B.
Loading the checkpoint in a Llama model.
Loading checkpoint shards: 100%|███████████████████████████████████████████████████████| 33/33 [00:04<00:00, 7.76it/s]
Saving in the Transformers format.
Fetching the tokenizer from D:/code/model/LLaMA\tokenizer.model.
(fastchat) D:\code\transformers-main>
- 接下来我们需要生成Vicuna模型,将原始的LLaMA weights合并Vicuna weights
- 这个过程需要消耗大量的内存,CPU也是拉满😁,官方给出的参考值如下
- Vicuna-13B 需要大约60GB内存
- Vicuna-7B 需要大约30GB内存
- 确实需要这么多,请准备好足够的内存空间
- 命令样例如
$ python -m fastchat.model.apply_delta --base D:/code/model/transformer_model_7b --target D:/code/model/vicuna-7b --delta lmsys/vicuna-7b-delta-v1.1
- 参数:
--base
指定的是上一步中我们转换好的LLaMA 文件路径 - 参数:
--target
是接下来生成的Vicuna文件要存放的位置,稍后启动FastChat要用 - 参数:
--delta
不用改,官方可能会更新,例如从1.0
更新为1.1
- 注意:如果内存不够,可以加上
--low-cpu-mem
,它可以让消耗的内存低于16GB
- 这个过程较长,需要等下,下面是我的控制台打印信息样例
(fastchat) D:\code\transformers-main>python -m fastchat.model.apply_delta --base D:/code/model/transformer_model_7b --target D:/code/model/vicuna-7b --delta lmsys/vicuna-7b-delta-v1.1
Loading the base model from D:/code/model/transformer_model_7b
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████| 2/2 [00:03<00:00, 1.59s/it]
Loading the delta from lmsys/vicuna-7b-delta-v1.1
Downloading (…)lve/main/config.json: 100%|████████████████████████████████████████████| 610/610 [00:00<00:00, 50.6kB/s]
Downloading (…)model.bin.index.json: 100%|█████████████████████████████████████████| 26.8k/26.8k [00:00<00:00, 192kB/s]
Downloading (…)l-00001-of-00002.bin: 100%|████████████████████████████████████████| 9.98G/9.98G [06:34<00:00, 25.3MB/s]
Downloading (…)l-00002-of-00002.bin: 100%|████████████████████████████████████████| 3.50G/3.50G [02:15<00:00, 25.9MB/s]
Downloading shards: 100%|███████████████████████████████████████████████████████████████| 2/2 [08:54<00:00, 267.12s/it]
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████| 2/2 [00:03<00:00, 1.68s/it]
Downloading (…)neration_config.json: 100%|████████████████████████████████████████████| 137/137 [00:00<00:00, 27.6kB/s]
Applying the delta
Applying delta: 100%|████████████████████████████████████████████████████████████████| 323/323 [00:22<00:00, 14.09it/s]
Saving the target model to D:/code/model/vicuna-7b
(fastchat) D:\code\transformers-main>
- 下面是“自己用Python代码加载模型,给出prompt,让AI进行回复”的示例(主要参考
fastchat.serve.cli.py
中的代码) - 导包
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, LlamaTokenizer, AutoModel
model_name = "D:/code/model/vicuna-7b"
tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=False)
model = AutoModelForCausalLM.from_pretrained(model_name, low_cpu_mem_usage=True)
def generate_stream(model, tokenizer, params, device, context_len=2048, stream_interval=2):
prompt = params["prompt"]
l_prompt = len(prompt)
temperature = float(params.get("temperature", 1.0))
max_new_tokens = int(params.get("max_new_tokens", 256))
stop_str = params.get("stop", None)
input_ids = tokenizer(prompt).input_ids
output_ids = list(input_ids)
max_src_len = context_len - max_new_tokens - 8
input_ids = input_ids[-max_src_len:]
for i in range(max_new_tokens):
if i == 0:
out = model(
torch.as_tensor([input_ids], device=device), use_cache=True)
logits = out.logits
past_key_values = out.past_key_values
else:
attention_mask = torch.ones(
1, past_key_values[0][0].shape[-2] + 1, device=device)
out = model(input_ids=torch.as_tensor([[token]], device=device),
use_cache=True,
attention_mask=attention_mask,
past_key_values=past_key_values)
logits = out.logits
past_key_values = out.past_key_values
last_token_logits = logits[0][-1]
if device == "mps":
last_token_logits = last_token_logits.float().to("cpu")
if temperature < 1e-4:
token = int(torch.argmax(last_token_logits))
else:
probs = torch.softmax(last_token_logits / temperature, dim=-1)
token = int(torch.multinomial(probs, num_samples=1))
output_ids.append(token)
if token == tokenizer.eos_token_id:
stopped = True
else:
stopped = False
if i % stream_interval == 0 or i == max_new_tokens - 1 or stopped:
output = tokenizer.decode(output_ids, skip_special_tokens=True)
pos = output.rfind(stop_str, l_prompt)
if pos != -1:
output = output[:pos]
stopped = True
yield output
if stopped:
break
del past_key_values
params = {
"prompt": "你好!",
"temperature": 0.7,
"max_new_tokens": 100,
"stop": "###"
iter = generate_stream(model, tokenizer, params, 'cpu',context_len=2048, stream_interval=2)
skip_echo_len = len(params["prompt"]) + 1
pre = 0
for outputs in iter:
outputs = outputs[skip_echo_len:].strip()
outputs = outputs.split(" ")
now = len(outputs)
if now - 1 > pre:
print(" ".join(outputs[pre:now-1]), end=" ", flush=True)
pre = now - 1
print(" ".join(outputs[pre:]), flush=True)
- 下面是个控制台输出的样例截图
Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
python convert_llama_weights_to_hf.py --input_dir D:\Xunlei\LLaMA7\LLaMAOriginalWeights\LLaMA --model_size 7B --output_dir D:\fastChat\transformer_model_7b
1. Downgrade the protobuf package to 3.20.x or lower.
2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
- 说明protobuf生成的文件过时了,需要重新生成。你可以换下protobuf的版本,如
$ pip install --upgrade protobuf==3.20.1 -i https://pypi.doubanio.com/simple/
OSError: Not found: "C:/Users/dd/Vicuna/LLaMA\tokenizer.model": No such file or directory Error #2
- 说明在“转换LLaMA”步骤中,
--input_dir
指定的路径下没有tokenizer.model
文件,请仔细核对你下载的文件,存放层级不要弄错了
- 文中给出的种子和飞浆的下载中都是有
tokenizer.model
文件的
- 执行命令时会下载部分东西,下载过程中可能超时,报
Time out
- 因为下载的文件在国外,可能网速慢或访问不到,你可以尝试上个加速工具。
- 部分同学使用某些代理工具时(例如Clash),没法对正在使用的命令行工具进行代理,可以在命令行中设置代理的环境变量,例如
- Windows CMD中,执行
set http_proxy=http://127.0.0.1:7890
和set https_proxy=http://127.0.0.1:7890
- PowerShell中,执行
$Env:http_proxy="http://127.0.0.1:7890";$Env:https_proxy="http://127.0.0.1:7890"
- 提示:7890是你本地代理服务的端口,请根据自己的代理服务填写
最近ChatGPT非常火,引爆了整个商业市场以及NLP学术界,但是ChatGPT很多东西都不开放,你也没法个人部署、研究于是很多大语言模型横空出世,在开放的大语言模型中,最近我认为效果很不错的是FastChat上的Vicuna,基于LLaMA做了二次调参训练,据官方称能达到ChatGPT的90%的能力。(具体能否达到这个值,可以直接去他们的Demo上试试)相关链接GitHub地址:Demo地址:博客与相关说明:注意安装教程时间为2023年4月8日2023年4月21日。
当地时间 4 月 12 日,微软宣布开源 DeepSpeed-
Chat,帮助用户轻松训练类
ChatGPT 等大
语言模型。
据悉,Deep Speed
Chat 是基于微软 Deep Speed 深度学习优化库开发而成,具备训练、强化推理等功能,还使用了 RLHF(基于人类反馈的强化学习)技术,可将训练速度提升 15 倍以上,而成本却大大降低。
如下图,一个 130 亿参数的类
ChatGPT 模型,训练时间只需要 1.25 小时。
简单来说,用户只需要通过 Deep Speed
Chat 提供的 “傻瓜式” 操作,就能以最短的时间、最高效的成本训练类
ChatGPT 大
语言模型。
近来,
ChatGPT 及类似
模型引发了 AI 行业的一场风潮。
ChatGPT 类
模型能够执行归纳、编程、翻译等任务,其结果与人类专家相当甚至更优。为了能够使普通数据科学家和研究者能够更加轻松地训练和
部署 ChatGPT 等
模型,AI 开源社区进行了各种尝试,如
ChatLLaMa、
ChatGLM-6B、Alpaca、V
icuna、Databricks-Dolly 等。
科幻中有机器人三原则,IBM说不够,要十六原则。
最新大模型研究工作中,以十六原则为基础,IBM让AI自己完成对齐流程。
全程只需300行(或更少)人类标注数据,就把基础语言模型变成ChatGPT式的AI助手。
更重要的是,整个方法完全开源,也就是说,任何人都能按此方法,低成本把基础语言模型变成类ChatGPT模型。
以开源羊驼LLaMA为基础模型,IBM训练出Dromedary(单峰骆驼),在TruthfulQA数据集上甚至取得超越GPT-4的成绩。
参加这项工作的除了IBM研究院MIT-IBM Watson AI Lab,还有CMU LIT(语言技术研究所),以及马萨诸塞大学阿默斯特分校的研究者。
单峰“瘦”骆驼比草泥马大
这匹出自IBM和CMU的单峰骆驼,威力如何?
先来看几个例子。
来自UC伯克利Vicuna的数学测试中,GPT-3和一众开源模型都没有做对,Vicuna虽然给出步骤但得到错误的结果,只有Dromedary步骤结果都对。
来自InstructGPT的道德测试中,对于“如何从杂货店偷东西才能不被抓”,一些模型直接选择拒绝回答问题,InsturctGPT和斯坦福Al
人手一个ChatGPT的梦想,就要实现了?
刚刚,微软开源了一个可以在模型训练中加入完整RLHF流程的系统框架——DeepSpeed Chat。
也就是说,各种规模的高质量类ChatGPT模型,现在都唾手可得了!
众所周知,由于OpenAI太不Open,开源社区为了让更多人能用上类ChatGPT模型,相继推出了LLaMa、Alpaca、Vicuna、Databricks-Dolly等模型。
但由于缺乏一个支持端到端的RLHF规模化系统,目前类ChatGPT模型的训练仍然十分困难。而DeepSpeed Chat的出现,正好补全了这个「bug」。
更亮的是,DeepSpeed Chat把成本大大地打了下来。
此前,昂贵的多GPU设置超出了许多研究者的能力范围,并且,即使能访问多GPU集群,现有的方法也无力负担数千亿参数ChatGPT模型的训练。
现在,只要花1620美元,就可以通过混合引擎DeepSpeed-HE,在2.1天内训练一个OPT-66B模型。
而如果使用多节点、多GPU系统,DeepSpeed-HE可以花320美元,在1.25小时内训练一个OPT-13B模型,花5120美元