【0门槛大语言模型】一、无显卡跑通Qwen2的Demo

本教程是一个系列,带你玩转国内的各大模型:Qwen、GLM,实践各种技术包括全参微调、Lora微调、Agent、RAG等。

目录

完整代码如下:

from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2-7B-Instruct",
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B-Instruct")

prompt = "Give me a short introduction to large language model."
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)

generated_ids = model.generate(
    model_inputs.input_ids,
    max_new_tokens=512
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

代码详解

from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto

1.首先引入是的transformer库,transformers库是由huggingface所提供的一系列工具,包含了自然语言、计算机视觉、音频等领域,有transformers库的支持能大大降低我们开发的难度和复杂性。
2.我们从transformers库里面导入两个类,第一个是AutoModelForCausalLM,关于因果模型的自动类(Auto Classes),AutoModelForCausalLM是继承于Auto Classes,Auto Classes是transformers提供的一些列方便开发人员配置的类。
3.因果模型是诸如像ChatGPT一类模型,简单来说他是有上一个词预测下一个词的模型,必须有了上一次词(因)才能生成下一个词(果)然后引入的是另一个自动类AutoTokenizer,他也是继承于(Auto Classes),这是关于分词的一个类,我们输入自然语言例如“今天天气很好”,AutoTokenizer会把自然语言转化为数字,这样才能输入到模型中。
4.cuda可以简单理解为gpu(显卡)


model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2-7B-Instruct",
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B-Instruct")

1.我们根据AutoModelForCausalLM的from_pretrained方法加载Qwen2,Qwen2是通义千问团队已经预先训练好的模型了,我们直接拿来用,所以叫预训练模型,我们直接from_pretrained就能加载他。 torch_dtype是选择加载的数据精度,类似于是int型还是float型,大语言模型在推理的时候我们常用的有float16,这里我们选择Auto就行。
2.device_map是选择放到那个设备上,是cpu还是gpu,gpu这里使用cuda表示,cuda是nvidia推出的并行架构,NVIDIA的cuda生态完整,发展很多年了,现在跑Ai大部分都是用NVIDIA,这也就是为什么NVIDIA股票大涨的原因。
3.同样的我们加载预训练好的分词(tokenizer) ,这样我们就有了一个模型(model) 一个分词器(tokenizer),分词器把自然语言如“今天天气很好”转化为数字 然后输入到模型,模型然后生成回答。 加载模型需要一些时间因为足足有7个G


prompt = "Give me a short introduction to large language model."
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": prompt}
]

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

定义一个字符串prompt,也是就是我们所说的提示词,读prompt不是promote!!!
messages是模板 这个在后面会对比的
apply_chat_template会把prompt和messages组合起来,我们可以打印一下text 3


model_inputs = tokenizer([text], return_tensors="pt").to(device)

使用tokenizer把text全部变成模型所能处理的数字 1 ,return_tensors参数表示要返回的数据类型,我们选择返回pytorch的tensor简称pt,关于tensor的解释可以看下图,就是就是一堆立方体的数字,
.to(device)的意思是把tokenizer返回的一堆立方体数字放到device上,device指的是cuda或者cpu,在代码开头已经定义好了device = “cuda”
在文章开头也说了cuda可以简单理解为gpu
model_inputs就是我得到的数据,这个数据是text的数字表示,这个数据格式为tensor,且放在了GPU上。


generated_ids = model.generate(
    model_inputs.input_ids,  
    max_new_tokens=512
)

激动人心的时候到了,我们开始生成(generate)字了,这里讲快一点,然后在下面集中解释。
generate的一个参数是model_inputs.input_ids 也就是刚才model_inputs的一个属性。
max_new_tokens表面模型输出最大长度为512。
generated_ids是我们生成的字,这些字也是由数字表示。



generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

我们把关键部分取出来。


response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

然后再把数字转化为自然语言。
response就是我们得到的东西了

运行代码

没有云GPU的可以进以下网站注册,新用户白嫖70块,链接: GPU

注册好了直接点击右上角创建项目,然后输入项目名字。

111.PNG

配置资源

选择配置资源为B1.large

捕获.PNG

镜像

选择镜像为 CUDA12.1-PyTorch2.1.1 在第一页的倒数第二行,然后点击确认。

捕获2.PNG

数据

暂时不用

模型

选择云上已经下载好了的模型,点击公开,然后搜索Qwen/Qwen2-7B-Instruct,选择好了点右下角确认。

3.PNG

所有的配置好了如下图,然后点击立即启动。

222.PNG

请看右边正在分配资源,我们马上就能拥有一块GPU了

44.PNG

点击进入开发环境我们正式开始开发了

5.PNG

我们新建一个Notebook,点击下图所示:

6获.PNG

首先粘贴如下代码:

# 先升级一下环境
!pip install --upgrade pip
!pip install --upgrade datasets torchx
!pip install --upgrade transformers 

然后鼠标发到黄色位置,再新建一个cell

7.PNG
再新建一个cell,粘贴以下代码。

from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto

model = AutoModelForCausalLM.from_pretrained(
    "/gemini/pretrain/Qwen2-7B-Instruct",
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("/gemini/pretrain/Qwen2-7B-Instruct")
# 上面代码运行一次就够了,如果需要修改prompt,重新生成结果的话,复制下面代码粘贴到新的cell上运行

再新建一个cell,粘贴以下代码。

prompt = "端午节有些什么习俗?"
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)

generated_ids = model.generate(
    model_inputs.input_ids,
    max_new_tokens=512
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

print(response)

一共就有3个cell
点击第一个cell然后点击上面的播放按钮运行第一个cell,

8.PNG

这个圆圈深色表示cell还在运行

9.PNG

同样点击第二个cell,点击运行,这一步可能要加载1-2分钟

10.PNG

接下来运行第三个cell,就得到结果了,更改prompt后只需要运行第三个cell,因为模型都加载进去了不需要二次加载。

12.PNG

不用了GPU了一定要点 停止并销毁 不然GPU一直在运行。

13.PNG

扩展知识

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值