transformers库本地部署大语言模型

 

Hugging Face Transformers 
Hugging Face Transformers 是一个强大的开源库,它提供了标准化的接口来加载和使用数以万计的预训练模型。


选择模型

为了让大多数个人电脑上顺利运行,选择了一个小规模但功能强大的模型:Qwen/Qwen1.5-0.5B-Chat。这是一个由阿里巴巴达摩院开源的拥有约 5 亿参数的对话模型,它体积小、性能优异,非常适合入门学习和本地部署。

 

配置环境

 

执行nvidia-smi,查看右上角。验证显卡驱动已安装最高支持的版本。

nvidia-smi

#在调试时,为了实时观察GPU利用率,一般新开一个命令窗口,执行以下命令,一秒刷新一次。

watch -n 1 nvidia-smi

执行nvcc -V验证cuda

nvcc -V

执行conda --version验证conda版本

conda --version

#列出所有已创建的Conda 环境​​:

conda env list
或
conda info --envs

#若存在,先删除已存在环境

conda env remove -n conda_transformers_qwen_05b

#创建新环境

conda create -n conda_transformers_qwen_05b python=3.10

#激活环境

conda activate conda_transformers_qwen_05b

 

根据CUDA版本安装PyTorch​​:
​​CUDA 12.1​​:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

​​CUDA 12.2​​:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu122

 

#验证Torch是否能正确识别GPU

python3 -c "import torch; print('PyTorch版本:', torch.__version__); print('CUDA可用:', torch.cuda.is_available()); print('CUDA版本:', torch.version.cuda); print('GPU设备:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'None'); print('GPU数量:', torch.cuda.device_count());"

 

#依赖库安装 transformers

pip install transformers -i https://mirrors.aliyun.com/pypi/simple/

 #验证transformers库是否安装成功

python3 -c "import transformers; print('transformers导入成功,版本:', transformers.__version__)"

 

# 由于官网源https://huggingface.co国内访问卡慢。可以使用国内镜像站hf-mirror.com
# 设置环境变量,临时设置(仅当前终端有效)

export HF_ENDPOINT="https://hf-mirror.com"

 加载模型测试

CUDA_VISIBLE_DEVICES=4 python3 -c "
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import os

# 指定模型ID
model_id = 'Qwen/Qwen1.5-0.5B-Chat'

# 设置设备,优先使用GPU
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f'Using device: {device}')

# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_id)

# 加载模型,并将其移动到指定设备
model = AutoModelForCausalLM.from_pretrained(model_id).to(device)

print('模型和分词器加载完成!')

# 可选:添加简单的交互测试
print('模型测试:输入一段文本测试生成(输入quit退出)')
while True:
    user_input = input('请输入: ')
    if user_input.lower() == 'quit':
        break
    inputs = tokenizer(user_input, return_tensors='pt').to(device)
    generated_ids = model.generate(**inputs, max_new_tokens=50)
    response = tokenizer.decode(generated_ids[0], skip_special_tokens=True)
    print(f'模型回复: {response}')
"

测试截图

image

 

 

加载模型,并将文本提示转换为模型能够理解的数字 ID(即 Token ID)。

CUDA_VISIBLE_DEVICES=4 python3 -c "
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import os

# 指定模型ID
model_id = 'Qwen/Qwen1.5-0.5B-Chat'

# 设置设备,优先使用GPU
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f'Using device: {device}')

# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_id)

# 加载模型,并将其移动到指定设备
model = AutoModelForCausalLM.from_pretrained(model_id).to(device)

print('模型和分词器加载完成!')

# 准备对话输入
messages = [
    {'role': 'system', 'content': 'You are a helpful assistant.'},
    {'role': 'user', 'content': '你好,请介绍你自己。'}
]

# 使用分词器的模板格式化输入
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

# 编码输入文本
model_inputs = tokenizer([text], return_tensors='pt').to(device)

print('编码后的输入文本:')
print(model_inputs)
"

输出:

Using device: cuda
模型和分词器加载完成!
编码后的输入文本:
{'input_ids': tensor([[151644,   8948,    198,   2610,    525,    264,  10950,  17847,     13,
         151645,    198, 151644,    872,    198, 108386,  37945, 100157, 107828,
           1773, 151645,    198, 151644,  77091,    198]], device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],
       device='cuda:0')}
(conda_transformers_qwen_05b) admin1@admin:~$ 

 

调用模型的 generate() 方法来生成回答。模型会输出一系列 Token ID,这代表了它的回答。

最后,我们需要使用分词器的 decode() 方法,将这些数字 ID 翻译回人类可以阅读的文本。

CUDA_VISIBLE_DEVICES=4 python3 -c "
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import os

# 指定模型ID
model_id = 'Qwen/Qwen1.5-0.5B-Chat'

# 设置设备,优先使用GPU
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f'Using device: {device}')

# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_id)

# 加载模型,并将其移动到指定设备
model = AutoModelForCausalLM.from_pretrained(model_id).to(device)

print('模型和分词器加载完成!')

# 准备对话输入
messages = [
    {'role': 'system', 'content': 'You are a helpful assistant.'},
    {'role': 'user', 'content': '你好,请介绍你自己。'}
]

# 使用分词器的模板格式化输入
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

# 编码输入文本
model_inputs = tokenizer([text], return_tensors='pt').to(device)

print('编码后的输入文本:')
print(model_inputs)


# 使用模型生成回答
# max_new_tokens 控制了模型最多能生成多少个新的Token
generated_ids = model.generate(
    model_inputs.input_ids,
    max_new_tokens=512
)

# 将生成的 Token ID 截取掉输入部分
# 这样我们只解码模型新生成的部分
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

# 解码生成的 Token ID
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

print('\n模型的回答:')
print(response)
"

输出截图:

image

 

posted on 2025-11-12 08:24  yi-sheng  阅读(2)  评论(0)    收藏  举报