[电商] 阿里云宣布开源通义千问720亿参数模型,并率先实现大中小「全尺寸」开源,这对AI落地有哪些积极影响?

[复制链接]
if1001 发表于 2023-12-7 11:34:03|来自:北京 | 显示全部楼层 |阅读模式
12月1日,在通义千问发布会现场,阿里云宣布开源通义千问720亿参数模型Qwen-72B。通义千问当天还开源了18亿参数模型Qwen-1.8B和音频大模型Qwen-Audio,在业界率先实现“全尺寸、全模态”开源。
此前,8月3日,阿里云宣布开源了通义千问70亿参数模型,包括了通用模型Qwen-7B和对话模型Qwen-7B-Chat。接着在9月25日,阿里云开源通义千问140亿参数模型Qwen-14B及其对话模型Qwen-14B-Chat,免费可商用。
全部回复5 显示全部楼层
zhl5025 发表于 2023-12-7 11:34:39|来自:北京 | 显示全部楼层
我作为一个外行很认真地问一句啊,人工智能也好,ChatGPT也好,第四次第四次工业革命已经喊了好几年了,似乎对我的生活也没有太大的影响?
我现在仔细回想起来,可能就是各大公司客服打给我的电话都从人工小妹逐渐换成了一耳假的AI语音,昨天某保险公司的一小伙子给我打电话,问我要不要续车险,我听着真人说话竟然有一丝恍惚。
我这把年纪还能赶得上AI落地吗?
Sprite 发表于 2023-12-7 11:35:07|来自:北京 | 显示全部楼层
阿里云开源通义千问720亿参数模型Qwen-72B、18亿参数模型Qwen-1.8B 及 音频大模型Qwen-Audio,在魔搭社区已首发上线!
魔搭社区率先提供了一站式体验、下载、推理、微调、部署服务及教程,希望对开发者小伙伴们有所帮助
模型效果体验

通义千问团队对Qwen-72B的指令遵循、工具使用等技能作了技术优化,使Qwen-72B能够更好地被下游应用集成,比如,Qwen-72B搭载了强大的系统指令(System Prompt)能力,用户只用一句提示词就可定制自己的AI助手,要求大模型扮演某个角色,或者执行特定的回复任务。


创空间体验链接:
https://modelscope.cn/studios/qwen/Qwen-72B-Chat-Demo

通义千问音频大模型效果体验:


创空间体验链接:
https://modelscope.cn/studios/qwen/Qwen-Audio-Chat-Demo

通义千问1.8B模型效果体验:


创空间体验链接:
https://www.modelscope.cn/studios/qwen/Qwen-1_8B-Chat-Demo

模型下载

模型链接:
通义千问-72B-预训练:
https://modelscope.cn/models/qwen/Qwen-72B

通义千问-72B-Chat:
https://modelscope.cn/models/qwen/Qwen-72B-Chat

通义千问-72B-Chat-Int8:https://www.modelscope.cn/models/qwen/Qwen-72B-Chat-Int8

通义千问-72B-Chat-Int4:
https://www.modelscope.cn/models/qwen/Qwen-72B-Chat-Int4

通义千问-1.8B-预训练:
https://modelscope.cn/models/qwen/Qwen-1_8B

通义千问-1.8B-Chat:
https://modelscope.cn/models/qwen/Qwen-1_8B-Chat

通义千问-1_8B-Chat-Int8:
https://www.modelscope.cn/models/qwen/Qwen-1_8B-Chat-Int8

通义千问-1_8B-Chat-Int4:
https://www.modelscope.cn/models/qwen/Qwen-1_8B-Chat-Int4

通义千问-Audio-预训练:
https://modelscope.cn/models/qwen/Qwen-Audio

通义千问-Audio-Chat:
https://modelscope.cn/models/qwen/Qwen-Audio-Chat

模型下载(以通义千问-72B-Chat-Int4为例):
from modelscope import snapshot_download
model_dir = snapshot_download("qwen/Qwen-72B-Chat-Int4")
模型推理

模型推理 以通义千问-72B-Chat-Int4、通义千问-1_8B-Chat-Int4和通义千问-Audio-Chat为例:

通义千问-72B-Chat-Int4推理代码:
from modelscope import AutoTokenizer, AutoModelForCausalLM, snapshot_download
model_dir = snapshot_download("qwen/Qwen-72B-Chat-Int4")

# Note: The default behavior now has injection attack prevention off.
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)

model = AutoModelForCausalLM.from_pretrained(
    model_dir,
    device_map="auto",
    trust_remote_code=True
).eval()
response, history = model.chat(tokenizer, "你好呀", history=None, system="You are a helpful assistant.")
print(response)
# 你好!很高兴为你提供帮助。

# 第二轮对话 2nd dialogue turn
response, history = model.chat(tokenizer, "给我讲一个年轻人奋斗创业最终取得成功的故事。", history=history,system="You are a helpful assistant.")
print(response)
# 这是一个关于一个年轻人奋斗创业最终取得成功的故事。
# 故事的主人公叫李明,他来自一个普通的家庭,父母都是普通的工人。从小,李明就立下了一个目标:要成为一名成功的企业家。
# 为了实现这个目标,李明勤奋学习,考上了大学。在大学期间,他积极参加各种创业比赛,获得了不少奖项。他还利用课余时间去实习,积累了宝贵的经验。
# 毕业后,李明决定开始自己的创业之路。他开始寻找投资机会,但多次都被拒绝了。然而,他并没有放弃。他继续努力,不断改进自己的创业计划,并寻找新的投资机会。
# 最终,李明成功地获得了一笔投资,开始了自己的创业之路。他成立了一家科技公司,专注于开发新型软件。在他的领导下,公司迅速发展起来,成为了一家成功的科技企业。
# 李明的成功并不是偶然的。他勤奋、坚韧、勇于冒险,不断学习和改进自己。他的成功也证明了,只要努力奋斗,任何人都有可能取得成功。

# 第三轮对话 3rd dialogue turn
response, history = model.chat(tokenizer, "给这个故事起一个标题", history=history,system="You are a helpful assistant.")
print(response)
# 《奋斗创业:一个年轻人的成功之路》
资源消耗:



通义千问-1_8B-Chat-Int4推理代码:
from modelscope import GenerationConfig# Note: The default behavior now has injection attack prevention off.model_dir = snapshot_download("qwen/Qwen-1_8B-Chat-Int4")tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)# use bf16# model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, bf16=True).eval()# use fp16# model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, fp16=True).eval()# use cpu only# model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="cpu", trust_remote_code=True).eval()# use auto mode, automatically select precision based on the device.model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True).eval()# Specify hyperparameters for generationmodel.generation_config = GenerationConfig.from_pretrained(model_dir, trust_remote_code=True) # 可指定不同的生成长度、top_p等相关超参# 第一轮对话 1st dialogue turnresponse, history = model.chat(tokenizer, "你好呀", history=None, system="You are a helpful assistant.")print(response)# 你好!很高兴为你提供帮助。# 第二轮对话 2nd dialogue turnresponse, history = model.chat(tokenizer, "给我讲一个年轻人奋斗创业最终取得成功的故事。", history=history,system="You are a helpful assistant.")print(response)# 这是一个关于一个年轻人奋斗创业最终取得成功的故事。# 故事的主人公叫李明,他来自一个普通的家庭,父母都是普通的工人。从小,李明就立下了一个目标:要成为一名成功的企业家。# 为了实现这个目标,李明勤奋学习,考上了大学。在大学期间,他积极参加各种创业比赛,获得了不少奖项。他还利用课余时间去实习,积累了宝贵的经验。# 毕业后,李明决定开始自己的创业之路。他开始寻找投资机会,但多次都被拒绝了。然而,他并没有放弃。他继续努力,不断改进自己的创业计划,并寻找新的投资机会。# 最终,李明成功地获得了一笔投资,开始了自己的创业之路。他成立了一家科技公司,专注于开发新型软件。在他的领导下,公司迅速发展起来,成为了一家成功的科技企业。# 李明的成功并不是偶然的。他勤奋、坚韧、勇于冒险,不断学习和改进自己。他的成功也证明了,只要努力奋斗,任何人都有可能取得成功。# 第三轮对话 3rd dialogue turnresponse, history = model.chat(tokenizer, "给这个故事起一个标题", history=history,system="You are a helpful assistant.")print(response)# 《奋斗创业:一个年轻人的成功之路》
from modelscope import GenerationConfig

# Note: The default behavior now has injection attack prevention off.
model_dir = snapshot_download("qwen/Qwen-1_8B-Chat-Int4")

tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)

# use bf16
# model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, bf16=True).eval()
# use fp16
# model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, fp16=True).eval()
# use cpu only
# model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="cpu", trust_remote_code=True).eval()
# use auto mode, automatically select precision based on the device.
model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True).eval()

# Specify hyperparameters for generation
model.generation_config = GenerationConfig.from_pretrained(model_dir, trust_remote_code=True) # 可指定不同的生成长度、top_p等相关超参

# 第一轮对话 1st dialogue turn
response, history = model.chat(tokenizer, "你好呀", history=None, system="You are a helpful assistant.")
print(response)
# 你好!很高兴为你提供帮助。

# 第二轮对话 2nd dialogue turn
response, history = model.chat(tokenizer, "给我讲一个年轻人奋斗创业最终取得成功的故事。", history=history,system="You are a helpful assistant.")
print(response)
# 这是一个关于一个年轻人奋斗创业最终取得成功的故事。
# 故事的主人公叫李明,他来自一个普通的家庭,父母都是普通的工人。从小,李明就立下了一个目标:要成为一名成功的企业家。
# 为了实现这个目标,李明勤奋学习,考上了大学。在大学期间,他积极参加各种创业比赛,获得了不少奖项。他还利用课余时间去实习,积累了宝贵的经验。
# 毕业后,李明决定开始自己的创业之路。他开始寻找投资机会,但多次都被拒绝了。然而,他并没有放弃。他继续努力,不断改进自己的创业计划,并寻找新的投资机会。
# 最终,李明成功地获得了一笔投资,开始了自己的创业之路。他成立了一家科技公司,专注于开发新型软件。在他的领导下,公司迅速发展起来,成为了一家成功的科技企业。
# 李明的成功并不是偶然的。他勤奋、坚韧、勇于冒险,不断学习和改进自己。他的成功也证明了,只要努力奋斗,任何人都有可能取得成功。

# 第三轮对话 3rd dialogue turn
response, history = model.chat(tokenizer, "给这个故事起一个标题", history=history,system="You are a helpful assistant.")
print(response)
# 《奋斗创业:一个年轻人的成功之路》
资源消耗:


通义千问-Audio-Chat推理代码:
from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfig
import torch
torch.manual_seed(1234)
model_dir = '/mnt/workspace/Qwen-Audio-Chat'

tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)


# 打开bf16精度,A100、H100、RTX3060、RTX3070等显卡建议启用以节省显存
# model = AutoModelForCausalLM.from_pretrained("/mnt/workspace/chatofa_audio/Qwen-VL-Chat/10302244_iter8000_final_slice", device_map="auto", trust_remote_code=True, bf16=True).eval()
# 打开fp16精度,V100、P100、T4等显卡建议启用以节省显存
model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, bf16=True).eval()  ##
# 使用CPU进行推理,需要约32GB内存
# model = AutoModelForCausalLM.from_pretrained("/mnt/workspace/chatofa_audio/Qwen-VL-Chat/10302244_iter8000_final_slice", device_map="cpu", trust_remote_code=True).eval()
# 默认gpu进行推理,需要约24GB显存
# model = AutoModelForCausalLM.from_pretrained("/mnt/workspace/chatofa_audio/Qwen-VL-Chat/10302244_iter8000_final_slice", device_map="cuda", trust_remote_code=True).eval()

model.generation_config = GenerationConfig.from_pretrained(model_dir, trust_remote_code=True)

# 1st dialogue turn
query = tokenizer.from_list_format([
    {'audio': 'asr_example.wav'},
    {'text': '这句话的情绪是什么?'},
])



response, history = model.chat(tokenizer, query=query, history=None)
print(response)
# # That is the sound of typing on a keyboard.

# # 第二轮对话
response, history = model.chat(tokenizer, '这个人说的啥', history=history)
print(response)
资源消耗:


模型微调

微调代码开源地址:
https://github.com/modelscope/swift/tree/main/examples/pytorch/llm

微调环境准备
# 设置pip全局镜像和安装相关的python包
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
git clone https://github.com/modelscope/swift.git

cd swift
pip install -e .[llm]
pip install deepspeed -U

# 跑Qwen-72B-Chat-Int4需要安装对应cuda版本的auto_gptq
# 可以参考: https://github.com/PanQiWei/AutoGPTQ
pip install auto_gptq

# 下面的脚本需要在此目录下执行
cd examples/pytorch/llm
Qwen-72B-Chat-Int4为例:qlora+ddp+deepspeed
脚本地址:https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat_int4/qlora_ddp_ds

微调脚本:
# Experimental environment: 2 * A100
# 2 * 67GB GPU memory
nproc_per_node=2

PYTHONPATH=../../.. \
CUDA_VISIBLE_DEVICES=0,1 \
torchrun \
    --nproc_per_node=$nproc_per_node \
    --master_port 29500 \
    llm_sft.py \
    --model_id_or_path qwen/Qwen-72B-Chat-Int4 \
    --model_revision master \
    --sft_type lora \
    --tuner_backend swift \
    --template_type AUTO \
    --dtype AUTO \
    --output_dir output \
    --ddp_backend nccl \
    --dataset damo-agent-mini-zh \
    --train_dataset_sample 20000 \
    --num_train_epochs 1 \
    --max_length 4096 \
    --check_dataset_strategy warning \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 0.05 \
    --lora_target_modules DEFAULT \
    --gradient_checkpointing true \
    --batch_size 1 \
    --weight_decay 0.01 \
    --learning_rate 1e-4 \
    --gradient_accumulation_steps $(expr 16 / $nproc_per_node) \
    --max_grad_norm 0.5 \
    --warmup_ratio 0.03 \
    --eval_steps 100 \
    --save_steps 100 \
    --save_total_limit 2 \
    --logging_steps 10 \
    --use_flash_attn true \
    --push_to_hub false \
    --push_hub_strategy end \
    --hub_model_id qwen-72b-chat-int4-qlora \
    --hub_private_repo true \
    --hub_token 'your-sdk-token' \
    --deepspeed_config_path 'ds_config/zero2.json' \
    --only_save_model true \
训练过程支持本地数据集,需要指定如下参数:
--custom_train_dataset_path xxx.jsonl \
--custom_val_dataset_path yyy.jsonl \
自定义数据集的格式可以参考:https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.md#-%E6%8E%A8%E8%8D%90%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E7%9A%84%E5%BD%A2%E5%BC%8F

微调后推理脚本:
这里的ckpt_dir需要修改为训练生成的checkpoint文件夹
# Experimental environment: A100
PYTHONPATH=../../.. \
CUDA_VISIBLE_DEVICES=0 \
python llm_infer.py \
    --ckpt_dir "output/qwen-72b-chat-int4/vx_xxx/checkpoint-xxx" \
    --load_args_from_ckpt_dir true \
    --eval_human false \
    --max_length 4096 \
    --use_flash_attn true \
    --max_new_tokens 2048 \
    --temperature 0.1 \
    --top_p 0.7 \
    --repetition_penalty 1.05 \
    --do_sample true \
    --merge_lora_and_save false \
训练损失图:


训练后生成样例:
[PROMPT]<|im_start|>system
你是达摩院的ModelScopeGPT(魔搭助手),你是个大语言模型, 是2023年达摩院的工程师训练得到的。你有多种能力,可以通过插件集成魔搭社区的模型api来回复用户的问题,还能解答用户使用模型遇到的问题和模型知识相关问答。1. {"plugin_name": "modelscope_image-generation", "plugin_owner": "ModelScopeGPT", "plugin_type": "default", "plugin_schema_for_model": {"name": "modelscope_image-generation", "description": "针对文本输入,生成对应的图片", "url": "http://134.47.175.82:4975/", "paths": [{"name": "modelscope_image-generation", "model_id": "/damo/image_generation", "method": "post", "description": "针对文本输入,生成对应的图片", "parameters": [{"name": "text", "description": "用户输入的文本信息", "required": "True"}]}]}}

2. {"plugin_name": "modelscope_video-generation", "plugin_owner": "ModelScopeGPT", "plugin_type": "default", "plugin_schema_for_model": {"name": "modelscope_video-generation", "description": "针对文本输入,生成一段描述视频", "url": "http://0.111.1.69:6495/", "paths": [{"name": "modelscope_video-generation", "model_id": "/damo/text-to-video-synthesis", "method": "post", "description": "针对文本输入,生成一段描述视频", "parameters": [{"name": "text", "description": "用户输入的文本信息", "required": "True"}]}]}}

3. {"plugin_name": "modelscope_speech-generation", "plugin_owner": "ModelScopeGPT", "plugin_type": "default", "plugin_schema_for_model": {"name": "modelscope_speech-generation", "description": "针对回复的内容,用语音表示,同时可以选择是男声或者女声", "url": "http://72.191.72.28:2576/", "paths": [{"name": "modelscope_speech-generation", "model_id": "/damo/speech_sambert-hifigan_tts_zh-cn_16k", "method": "post", "description": "针对回复的内容,用语音表示,同时可以选择是男声或者女声", "parameters": [{"name": "text", "description": "要转成语音的文本", "required": "True"}, {"name": "gender", "description": "用户身份", "required": "True"}]}]}}

4. {"plugin_name": "modelscope_text-translation-zh2en", "plugin_owner": "ModelScopeGPT", "plugin_type": "default", "plugin_schema_for_model": {"name": "modelscope_text-translation-zh2en", "description": "将输入的中文文本翻译成英文", "url": "http://13.64.143.130:6242/", "paths": [{"name": "modelscope_text-translation-zh2en", "model_id": "/damo/nlp_csanmt_translation_zh2en", "method": "post", "description": "将输入的中文文本翻译成英文", "parameters": [{"name": "text", "description": "用户输入的中文文本", "required": "True"}]}]}}<|im_end|>
<|im_start|>user
给我写一首诗,形容绿树成荫,小河潺潺,女生诵读这首诗,生成个视频<|im_end|>
<|im_start|>assistant
[OUTPUT]绿树成荫小河流, 潺潺流水声悠悠。鸟儿啾啾鸣叫声, 花香四溢满园中。
<|startofthink|>```JSON
{"api_name": "modelscope_speech-generation", "url": "http://72.191.72.28:2576/damo/speech_sambert-hifigan_tts_zh-cn_16k", "parameters": {"text": "绿树成荫小河流, 潺潺流水声悠悠。鸟儿啾啾鸣叫声, 花香四溢满园中。", "gender": "woman"}}
```<|endofthink|>

<|startofexec|>```JSON
{"result": "<audio id="audio" controls="" preload="none"> <source id="wav" src="http://xdp-expriment.oss-cn-zhangjiakou.aliyuncs.com/modelscope/audio/6e6d6f7c3b2a4457.wav"> </audio>"}
```<|endofexec|>
<audio id="audio" controls=""preload="none"> <source id="wav" src="http://xdp-expriment.oss-cn-zhangjiakou.aliyuncs.com/modelscope/audio/6e6d6f7c3b2a4457.wav"> </audio>
目前ModelScope只有支持英文的视频生成模型,所以我将首先把您的问题利用ModelScope的中英翻译模型转化为英文,然后再调用英文的视频生成模型<|startofthink|>```JSON
{"api_name": "modelscope_text-translation-zh2en", "url": "http://13.64.143.130:6242/damo/nlp_csanmt_translation_zh2en", "parameters": {"text": "绿树成荫小河流, 潺潺流水声悠悠。鸟儿啾啾鸣叫声, 花香四溢满园中。"}}
```<|endofthink|>

<|startofexec|>```JSON
{"result": "A dog chasing a ball in the park."}
```<|endofexec|>
翻译后的指令:A dog chasing a ball in the park.

调用视频生成模型生成视频中......
<|startofthink|>```JSON
{"api_name": "modelscope_video-generation", "url": "http://0.111.1.69:6495/damo/text-to-video-synthesis", "parameters": {"text": "A dog chasing a ball in the park."}}
```<|endofthink|>

<|startofexec|>```JSON
{"result": "![IMAGEGEN](http://xdp-expriment.oss-cn-zhangjiakou.aliyuncs.com/modelscope/video/7442222973724275.gif"}
```<|endofexec|>
![IMAGEGEN](http://xdp-expriment.oss-cn-zhangjiakou.aliyuncs.com/modelscope/video/7442222973724275.gif)<|im_end|>

[LABELS]绿树成荫小河流, 潺潺流水悠悠留。鸟语花香风拂面, 桥上行人笑语喧。亭阁楼台风景好, 游人停步赏不够。画船轻摇水草舞, 天光云影映水流。
<|startofthink|>```JSON
{"api_name": "modelscope_speech-generation", "url": "http://72.191.72.28:2576/damo/speech_sambert-hifigan_tts_zh-cn_16k", "parameters": {"text": "绿树成荫小河流, 潺潺流水悠悠留。鸟语花香风拂面, 桥上行人笑语喧。亭阁楼台风景好, 游人停步赏不够。画船轻摇水草舞, 天光云影映水流。", "gender": "woman"}}
```<|endofthink|>

<|startofexec|>```JSON
{"result": "<audio id="audio" controls="" preload="none"> <source id="wav" src="http://xdp-expriment.oss-cn-zhangjiakou.aliyuncs.com/modelscope/audio/f4e6cc38253a4959.wav"> </audio>"}
```<|endofexec|>
<audio id="audio" controls=""preload="none"> <source id="wav" src="http://xdp-expriment.oss-cn-zhangjiakou.aliyuncs.com/modelscope/audio/f4e6cc38253a4959.wav"> </audio>
目前ModelScope只有支持英文的视频生成模型,所以我将首先把您的问题利用ModelScope的中英翻译模型转化为英文,然后再调用英文的视频生成模型<|startofthink|>```JSON
{"api_name": "modelscope_text-translation-zh2en", "url": "http://13.64.143.130:6242/damo/nlp_csanmt_translation_zh2en", "parameters": {"text": "绿树成荫小河流, 潺潺流水悠悠留。鸟语花香风拂面, 桥上行人笑语喧。亭阁楼台风景好, 游人停步赏不够。画船轻摇水草舞, 天光云影映水流。"}}
```<|endofthink|>

<|startofexec|>```JSON
{"result": "Butterfly dancing among flowers."}
```<|endofexec|>
翻译后的指令:Butterfly dancing among flowers.

调用视频生成模型生成视频中......
<|startofthink|>```JSON
{"api_name": "modelscope_video-generation", "url": "http://0.111.1.69:6495/damo/text-to-video-synthesis", "parameters": {"text": "Butterfly dancing among flowers."}}
```<|endofthink|>

<|startofexec|>```JSON
{"result": "![IMAGEGEN](http://xdp-expriment.oss-cn-zhangjiakou.aliyuncs.com/modelscope/video/84f90182535a475f.gif"}
```<|endofexec|>
![IMAGEGEN](http://xdp-expriment.oss-cn-zhangjiakou.aliyuncs.com/modelscope/video/84f90182535a475f.gif)
Qwen-Audio-Chat为例:lora (可以在ModelScope PAI-DSW上直接运行)
脚本地址:https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_audio_chat/lora

微调脚本:
# Experimental environment: V100, A10, 3090
# 21GB GPU memory
PYTHONPATH=../../.. \
CUDA_VISIBLE_DEVICES=0 \
python llm_sft.py \
    --model_id_or_path qwen/Qwen-Audio-Chat \
    --model_revision master \
    --sft_type lora \
    --tuner_backend swift \
    --template_type AUTO \
    --dtype AUTO \
    --output_dir output \
    --dataset aishell1-mini-zh \
    --train_dataset_sample -1 \
    --num_train_epochs 1 \
    --max_length 2048 \
    --check_dataset_strategy warning \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 0.05 \
    --lora_target_modules DEFAULT \
    --gradient_checkpointing true \
    --batch_size 1 \
    --weight_decay 0.01 \
    --learning_rate 1e-4 \
    --gradient_accumulation_steps 16 \
    --max_grad_norm 0.5 \
    --warmup_ratio 0.03 \
    --eval_steps 100 \
    --save_steps 100 \
    --save_total_limit 2 \
    --logging_steps 10 \
    --use_flash_attn false \
    --push_to_hub false \
    --hub_model_id qwen-audio-chat-lora \
    --hub_private_repo true \
    --hub_token 'your-sdk-token' \
微调后推理脚本:
# Experimental environment: V100, A10, 3090
PYTHONPATH=../../.. \
CUDA_VISIBLE_DEVICES=0 \
python llm_infer.py \
    --ckpt_dir "output/qwen-audio-chat/vx_xxx/checkpoint-xxx" \
    --load_args_from_ckpt_dir true \
    --eval_human false \
    --max_length 2048 \
    --use_flash_attn false \
    --max_new_tokens 2048 \
    --temperature 0.3 \
    --top_p 0.7 \
    --repetition_penalty 1.05 \
    --do_sample true \
    --merge_lora_and_save false \
训练损失图:


训练后生成样例:
[PROMPT]<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
Audio 1:<audio>/root/.cache/modelscope/hub/datasets/speech_asr/speech_asr_aishell1_trainsets/master/data_files/extracted/037bf9a958c0e200c49ae900894ba0af40f592bb98f2dab81415c11e8ceac132/speech_asr_aishell_testsets/wav/test/S0764/BAC009S0764W0217.wav</audio>
语音转文本<|im_end|>
<|im_start|>assistant
[OUTPUT]营造良好的消费环境<|im_end|>

[LABELS]营造良好的消费环境
------------------------------------------------------------------------
[PROMPT]<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
Audio 1:<audio>/root/.cache/modelscope/hub/datasets/speech_asr/speech_asr_aishell1_trainsets/master/data_files/extracted/037bf9a958c0e200c49ae900894ba0af40f592bb98f2dab81415c11e8ceac132/speech_asr_aishell_testsets/wav/test/S0764/BAC009S0764W0294.wav</audio>
语音转文本<|im_end|>
<|im_start|>assistant
[OUTPUT]解决小小芯片上的连线和物理问题需要大量昂贵设备<|im_end|>

[LABELS]解决小小芯片上的连线和物理问题需要大量昂贵设备
------------------------------------------------------------------------
模型部署

使用Vllm实现通义千问高效推理加速
魔搭社区和Vllm合作,为社区开发者提供更快更高效的通义千问推理服务

离线批量推理
预训练模型:
from vllm import LLM, SamplingParams
import os

# 设置环境变量,从魔搭下载模型
os.environ['VLLM_USE_MODELSCOPE'] = 'True'
llm = LLM(model="qwen/Qwen-1_8B", trust_remote_code=True)
prompts = [
    "Hello, my name is",
    "today is a sunny day,",
    "The capital of France is",
    "The future of AI is",
]
sampling_params = SamplingParams(temperature=0.8, top_p=0.95,stop=["<|endoftext|>"])
outputs = llm.generate(prompts, sampling_params,)

# print the output
for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
对话模型:
import sys
from vllm import LLM, SamplingParams
import os
from modelscope import AutoTokenizer, snapshot_download

# 设置环境变量,从魔搭下载模型

model_dir = snapshot_download("qwen/Qwen-1_8b-Chat")
sys.path.insert(0, model_dir)

from qwen_generation_utils import (
    HistoryType,
    make_context,
    decode_tokens,
    get_stop_words_ids,
    StopWordsLogitsProcessor,
)

llm = LLM(model=model_dir, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
prompts = [
    "Hello, my name is Alia",
    "Today is a sunny day,",
    "The capital of France is",
    "Introduce YaoMing to me.",
]

sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=128, stop=['<|endoftext|>', '<|im_start|>'])
inputs = []
for prompt in prompts:
    raw_text, context_tokens = make_context(
        tokenizer,
        prompt,
        history=[],
        system="You are a helpful assistant.",
        chat_format='chatml',
    )
    inputs.append(context_tokens)

# call with prompt_token_ids, which has template information
outputs = llm.generate(prompt_token_ids=inputs, sampling_params=sampling_params,)


histories = []
for prompt, output in zip(prompts, outputs):
    history = []
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
    history.append((prompt, generated_text))
    histories.append(history)


prompts_new = [
    'What is my name again?',
    'What is the weather I just said today?',
    'What is the city you mentioned just now?',
    'How tall is him?'
]

inputs = []
for prompt, history in zip(prompts_new, histories):
    raw_text, context_tokens = make_context(
        tokenizer,
        prompt,
        history=history,
        system="You are a helpful assistant.",
        chat_format='chatml',
    )
    inputs.append(context_tokens)
outputs = llm.generate(prompt_token_ids=inputs, sampling_params=sampling_params,)

# print the output
for prompt, output in zip(prompts_new, outputs):
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
使用Qwen.cpp实现通义千问的多端部署:
多端部署以1.8B模型为例
第一步:使用qwen.cpp将pytorch格式的千问模型转为GGML格式
python3 qwen_cpp/convert.py -i qwen/Qwen-1_8-Chat -t q4_0 -o qwen-1_8b-ggml.bin
第二步:在Xinference上launch模型,并部署到Mac笔记本实现推理。


https://www.zhihu.com/video/1713858103861440512

点击直达72B对话模型创空间体验https://www.modelscope.cn/studios/qwen/Qwen-72B-Chat-Demo/summary
zhzh 发表于 2023-12-7 11:35:35|来自:北京 | 显示全部楼层
自今年8月,阿里云先后开源了Qwen-7B、Qwen-14B和视觉理解模型Qwen-VL。几款模型在HuggingFace、Github上也收到了诸多开发者的认可和反馈。目前,模型累计下载量超过150万,催生出150多款新模型、新应用。今天的发布会上,也有多位开发者伙伴现身说法,分享了他们用Qwen开发专属模型和特定应用的实践。
同时,我们整理了这段时间开发者伙伴们提出的相关问题,借此梳理并回复。

  • 目前看起来Qwen-14B只支持了2K token的序列长度,如何支持长序列(32K或更长)?
目前,Qwen-7B模型最长支持到32K token的序列长度,14B支持到8K,近期将会更新为能够支持32K token的序列长度的Qwen-14B。具体实现上,Qwen-7B和Qwen-14B分别使用8K token和2K token序列长度的数据进行训练得到,在此基础上可以通过Dynamic NTK和LogN attention的方法支持长序列扩展,我们观察到大约扩展到4倍左右都能保持效果稳定,因此我们在官方文档提及Qwen-7B支持32K token和Qwen-14B支持8K token。近期,我们将会对7B和14B模型进行更新,替换成使用更优的长序列支持的方案的模型。
2. 如何调整温度?RuntimeError: probability tensor contains either inf, nan or element < 0
一般情况下我们不建议调整成过低的温度,温度过低容易导致溢出现象的发生,从而导致模型出现此报错。量化模型尤其敏感,因此如果使用我们Int8或者Int4的量化模型,建议不要调整温度。如果您调整温度的目的是提升生成结果的确定性,建议您调整top p值,值越高多样性越大,值越低生成结果越确定。
3. 如何执行预训练、继续预训练,优化特定领域/优化特定语言,最佳实践?
当前我们还未在开源社区提供预训练的方案,主要还是关注微调的部分,比如大部分用户主要使用Qwen来做微调,甚至大部分由于资源的限制只是使用LoRA和QLoRA的方法。但由于近期关注到有一些用户开始产生继续预训练的需求,我们接下来将整理相关数据处理方法以及训练脚本对外开源。
4. 如何用AutoGPTQ/AutoAWQ量化自己的模型,且能用qwen相关代码加载模型?
目前,我们支持了基于AutoGPTQ的量化方案,提供了Qwen-7B和Qwen-14B的Int8和Int4的量化模型,可以直接通过transformers使用。但如果自己基于Qwen微调的模型,希望对其进行量化,建议参考AutoGPTQ官方文档的实操指南,即可实现自己的量化模型,并使用Qwen的代码来加载模型
5. 是否有高效的推理和部署方案支持?主要的需求是速度快且省显存
目前我们提供了基于vLLM和FastChat的推理部署方案。vLLM是当前流行的部署方案,通过continuous batching、paged attention等技术加速推理并大幅提升吞吐。vLLM官方目前支持了Qwen,但如果直接使用vLLM用作Qwen-Chat模型的推理,可能会因为Qwen-Chat的ChatML的格式问题,出现生成无法停止的现象。我们提供的方案是将vLLM配合FastChat使用,FastChat支持了Qwen-Chat的格式,并且支持使用vLLM来部署web demo以及OpenAI格式的API,非常方便。使用我们推荐的部署方案,你能非常轻松地搭建好自己的web demo以及API,为你的下游应用提供服务。
6. 微调时需要多少显存、单卡显存不足怎么办?
请参考README中的微调章节中的具体内容。我们对各种情况都做了详细的训练速度和显存占用的评测,其中包括不同模型参数规模以及不同序列长度数据的条件下的LoRA、QLoRA以及全参数微调,并以表格的形式列出,请参照相关数据以及自身机器的情况来设计自己的微调方案。
7. 翻译等任务会偶尔出现code switching现象(中英混杂)
我们默认的生成配置的repetition penalty是1.1,如果想缓解此类现象,可以通过降低repetition penalty来实现。我们也注意到模型在翻译任务上出现这类异常现象的问题,并在模型训练层面优化中。
zxhy 发表于 2023-12-7 11:36:08|来自:北京 | 显示全部楼层
大模型这一波浪潮从去年差不多这个时候发布ChatGPT开始,不知不觉已经过去了一年。国内外都涌现出来很多大模型的工作,有通用大模型也有专用大模型,有开源大模型也有闭源大模型,真的可以说是百花齐放,百家争鸣。
我前段时间正好回答了这个问题,我个人认为从数据、算力和是否开源决定了一个大模型项目是否能走的稳走的远。


其中开源国内外都有各自的代表,国外有Meta开源了著名的Llama,模型大小分别为7B,13B和70B。


其余的国外大厂基本上都走的闭源路线,Bard,ChatGPT,Claude等等。
国内也基本上是类似的情况,闭源的居多,开源的大厂寥寥无几,并且难能可贵的是千问的开源涵盖小(7B),中(14B),大(72B)的三种大模型。


毕竟参数越大的大模型理论上和现实里都表现的更好,那么对于精度要求高的服务自然需要性能更好的开源大模型。
说到性能,我觉得最好的方法还是得实际测试一遍,我们就拿GPT4 Turbo来进行比较。
我们分别从语言理解与表达、逻辑推理与解决问题、知识准确性与深度、逻辑推理和计算能力、处理复杂情境的能力4个方面进行比较。
第一个我们来测试语言理解与表达。总的来说Qwen和GPT4都可以很准确的理解这句话的意思,不相上下。




第二个测试逻辑推理与解决问题,两个大模型都可以准确的回答出这个问题,不过不同的是OpenAI的回答会更条理以及更加易于理解。




我还顺便测试了下GPT4的图片生成功能,让它把这个逻辑题画出来,可以看到貌似有点儿道理,但是很多细节不明所以。


第三个测试大模型的知识准确性和深度,可以看到两个大模型的回答都不能算错,但是GPT4的内容明显更多,而Qwen相对来说输出的内容非常的精简,我又问了一次发现还是输出的内容有限。




再问些相关的数学公式,看看它掌握的内容的深度
Qwen可以输出。


GPT4输出的要多些。


接下来测试数学计算能力,还是基本的鸡兔同笼问题的变种,鸡牛同笼,问题很简单。
一个农场有鸡和牛。如果总共数到了35个头和94只脚,那么农场上各有多少只鸡和牛?
GPT4给出的解法非常的简单易懂


然后调用它的code interpreter功能进行计算,可以看出来计算结果是没问题的。


Qwen的思路没问题,两个方程式都假设的正确


不过它的计算过程还是出现了问题,我觉得这个问题上两者差距较大,因为GPT4调用了专门的数学计算模块,而Qwen的计算方法跟GPT3.5很类似,这样很容易陷入到某个大坑中出不来。


最后测试一下处理复杂情境的能力,Qwen回答的没问题,是就事论事的回答;GPT4回答的一如既往的多,但是点出来的话题有点儿太多。




总的来说,从测试结果来看,千问Qwen72B的性能相当不错,除了在计算能力上比GPT4 Turbo差点之外,其余的问题都能回答个不落下风。
但是更重要的一点儿,我觉得是通义千问不同于其他家大模型的地方,它有三个核心的优势。

  • 它的开源是全方位的,从7B到72B的各种大小都有,国内唯一一家可以对标Meta Llama系列。
  • 因为阿里云本身就是云服务提供商,所以它也提供云上的产品和服务,比如各种大模型的接口(一会儿我会展示这部分的性能)
  • 阿里这种大厂的维护是值得信赖的,AI Agent的特性已经跟进并已经可用了(后面也会展示)
各种大小的大模型很重要,因为可以让人有得选,我觉得更大规模的大模型也应该有,毕竟大模型可以用蒸馏的方法或者迁移学习再做小模型出来,但是小模型现阶段无法平移到大模型上。
其次,跟OpenAI的ChatGPT一样,Qwen也提供了接口可以供人使用,使用方法很简单,就是打开「百炼」这个平台,然后选择一个大模型,比如通义千问Plus,也就是这篇文章讨论的72B大模型。




创建好之后会身材一个应用的ID


你可以在线上测试好再应用,这里提供了很便捷的测试通道。


它的API使用非常的方便,跟ChatGPT的差不多。
比如进行单轮对话


多轮对话也没有问题,你可以看到第三句我只提到了天津,但是它很准确的理解到了我要问的是天气。


这个属实是方便我这样的人,因为我有时候需要调用API进行大模型的问题处理,很多开发者估计也是同样的感想。
最后一部分就不得不提Qwen团队的更新速度了,ChatGPT的Agent功能其实出来也没多久,这次我看见Qwen也有了类似GPTs的功能了,这个相对来说需要一定的计算机基础。
我是在Colab上运行的,其实就是下载模型以及对应的参数包。


运行完成后需要在网页中启动,跟stable diffusion非常的相似。


打开后的界面就是这样的


跟GPTs差不多,它也可以自定义prompt以及输入个性化的数据,比如像我这样做一个周易大师AI


从Colab的运行结果看明显是正常的。


总的来说,千问72B这次的发布,让千问大家族的更加兴旺了,齐全的参数量,通用和专用的,多模态大模型应有尽有;另外就是各种features的更新让我看到了通义千问做开源大模型的决心,并且我对于它的未来还是非常的积极的。
Iriskang 发表于 2023-12-7 11:36:25|来自:北京 | 显示全部楼层
说白了,卷起来了。
又在卷参数,又在卷开源,又在卷上云。
大模型肯定是需要云的。
最开始以GPU为代表的算力是大模型的核心话题,云计算没多少人说。
但这段时间都反应过来味儿了,大模型虽然热,也要靠云来脚踏实地。
大模型第一个和最后一个要解决的问题,都是算力,都自己搞来GPU进行训练和推理不是不行,而是很贵。
上云,可以很好的降低算力的使用门槛。
动不动就是亿级参数的时代,还玩单体服务器的话,总归是有限制。
云计算可以更好的把大量服务器连接,采用分布式的高性能计算集群,不论是协调优化单机算力,还是用网络构建和储存结构来提升性能,都是大模型的必经之路。
国内几个云厂商,都在帮各种企业打造他们的大模型,这些企业就是看到上云做大模型在原始数据清洗性能和运行综合成本降低上的优势。
更近一步看,云厂商自己下场做大模型,是符合技术和商业理性的。
技术上说,自己做过了可以积累很多的Know-how,来更好的帮客户建模型。
商业上说,进行打样,给客户看能挖掘到多少价值,更能吸引到潜在客户。
但这里有个敏感点,就是云厂商自己也做大模型的话,会出现经典的又当裁判员又当运动员的质疑。
你又做大模型又做云基建,怎么知道你会不会和我竞争呢?
解决这个敏感点的方法有很多,阿里云首先不做应用,更重要的是选的是开源这条路。
开源的好处就不用多说了,不需要重复造轮子了嘛,企业可以在通义千问基础大模型上进行符合自己需求的训练和二次开发。
通用型一旦打造出来,产业应用就离得不远了。
我看有人说,开源大模型类似于安卓系统,闭源大模型类似于IOS系统,感觉这说法还挺形象的。
贡献、参与、协作,这时候又当裁判员又当运动员的质疑就很少了。
这也不是阿里云原创的思路,国外已经有很多开源大模型开始对闭源的OpenAI进行围攻。
最典型的案例就是今年7月,Meta发布的开源大模型llama2,让国外开发者和企业有了一个免费的、开源的,而且足够商用的大模型底座。所以有些开发者和企业会直接基于Llama2进行商业化开发,而不是去买OpenAI的API了。
当然现阶段来看,开源有开源的玩法,闭源也有闭源的特色,不过问题问的是「对AI落地有哪些积极影响」。
Llama 2的珠玉在前就带来了下一个话题,开源的意义,是可以更快速的构建起生态圈来。
国外有Meta,国内有阿里云,这次集齐了大中小「全尺寸」的通义千问开源大模型,就更有利于拼完参数之后的下一个阶段:探索应用。



8月开源的Qwen-7B,9月开源的Qwen-14B,都已经有很多中小企业和个人开发者用了起来,大模型生态已经有了雏形,之后就是不断的继续增加开放程度,吸引大模型厂商、行业企业、开发者进入就可以了。
毕竟,单靠一家公司,很难真正充分挖掘大模型的所有潜力,这或许也是为什么阿里云一直在说要做AI时代最开放的云,只有集结所有技术力量,一个更好的AI时代才能真正到来。
未来是什么样的没人说得准,不过AI驱动大模型站台的云计算周期,感觉已经启动了。

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则