大模型学习应用 3: AutoDL 平台 transformers 环境搭建及模型部署使用(持续更新中)
之前我们学习了在和鲸的预配置好的平台上进行学习,在工作中并不现实,本期我们的目标是将已有模型部署到云端进行运行
配置环境:RTX 4090D(24GB) python 3.12(ubuntu22.04)
目录
注册及选择算力
首先登录官网完成注册
注册之后在算力市场找自己需要的显卡配置:

选择好显卡配置后,点击立即创建

创建后如图所示可以看到自己的实例,开机后点击jupyterLab 即可开始环境配置


新建虚拟环境并配置
进入终端后的基本设置
进入终端
vim ~/.bashrc
然后按英文模式的 i 进入编辑,按键盘下键到最后输入
source root/miniconda3/etc/profile.d/conda.sh
该语句可以自动设置好 Conda 环境,指的是在你每次打开一个新的终端时,系统会自动加载 Conda 的配置,使得你能够直接使用 Conda 命令(如 conda activate)来管理环境,而不需要手动进行初始化配置
然后先按键盘Esc键,使用命令 :wq 保存退出
进入终端后的界面,运行conda env list 可以看到现在的环境只有base

查看需要安装的对应版本
根据查到的cuda版本去pytorch官网获取对应的pip语句

我这里获取到的语句为:pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

新建虚拟环境
进入base环境
conda activate base
# 可能会报错‘...conda init’
#1、执行:
conda init
#2、执行:
bash
#3、重新激活:
conda activate base
新建环境并配置(注意配置虚拟环境时可以选择不使用显卡开机,不然太花钱啦)
# 1、创建transformers环境
(base) root@autodl-container-5af44aa208-40a903ee:~# conda create -n swx_transformers python=3.12 -y
# 2、此时,会有两个环境
(base) root@autodl-container-5af44aa208-40a903ee:~# conda env list
# conda environments:
#
base * /root/miniconda3
swx_transformers /root/miniconda3/envs/swx_transformers
# 3、激活创建的环境
(base) root@autodl-container-5af44aa208-40a903ee:~# conda create -n swx_transformers python=3.12 -y
Channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
- defaults
Platform: linux-64
Collecting package metadata (repodata.json): done
Solving environment: done
直接安装对应库
# 4、安装pytorch
# 4.1 设置下载源为清华源
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 4.1 进入pytorch官网下载最新版pytorch
# https://pytorch.org/
# 推荐使用pip安装
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip3 install torch torchvision torchaudio torchtext --index-url https://download.pytorch.org/whl/cu124
授权网盘再安装对应的库(推荐方法)
除了上述直接安装,我们还可以把对应安装包下载下来,上传网盘,然后下载都数据盘里用于安装
公网网盘授权方式见官网文档
授权后即可上传安装包(我这里默认的上传路径是/autodl-tmp/ 也可以选择 /autodl-fs)

下载对应安装包,在上一个流程中可以看到包的网站,直接点击进去选择对应包下载就可以了,需要注意安装兼容的版本
查询torch 与 torchvision版本对应关系
查询torch 与 torchtext版本对应关系
安装过程:
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install autodl-tmp/torch-2.4.0+cu124-cp312-cp312-linux_x86_64.whl
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install autodl-tmp/torchvision-0.19.0+cu124-cp312-cp312-linux_x86_64.whl
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install autodl-tmp/torchaudio-2.4.0+cu124-cp312-cp312-linux_x86_64.whl
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install autodl-tmp/torchaudio-2.4.0+cu124-cp312-cp312-linux_x86_64.whl
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install scikit-learn
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install pandas
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install transformers
后续安装模块记录
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install matplotlib seaborn
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install requests
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install psycopg2-binary
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~/autodl-tmp# pip install sqlalchemy
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~/autodl-tmp# pip install openpyxl
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~/autodl-tmp# pip install jieba
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~/autodl-tmp# pip install torchsummary
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~/autodl-tmp# pip install python-dotenv openai
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~/autodl-tmp# pip install fastapi uvicorn
RAG相关库安装(PDF)
(swx_transformers) root@autodl-container-5af44aa208-40a903ee:~# pip install pdfminer.six
jupyter 页面更新
jupyter页面更新(即在jupyter页面里增加一个基础环境:swx_transformers)
在swx_transformers环境中输入:conda install ipykernel
再输入:ipython kernel install --user --name=swx_transformers

模型训练
与本地运行一致,上传需要的数据、模型、代码,修改下路径就可以正常运行代码训练了

模型部署
使用 FastAPI 或 Flask 构建 API 服务,以下是基于 FastAPI 的实现:
安装依赖
pip install fastapi uvicorn
构建API
from transformers import BertTokenizer, BertForSequenceClassification
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import joblib
import torch
# # 加载模型和分词器
# def load_model_and_tokenizer():
# save_path = r'./model/模型参数/实物型解析/全部样本三轮_参数_20240829_212116.pth'
# label_encoder_path = r'./model/模型参数/实物型解析/label_encoder_3.pkl'
# label_encoder = joblib.load(label_encoder_path)
# model = BertForSequenceClassification.from_pretrained(
# r'./pretrained_transformers/chinese-roberta-wwm-ext/',
# num_labels=len(label_encoder.classes_)
# )
# model.load_state_dict(torch.load(save_path, map_location=torch.device('cpu'),weights_only=True)) # 使用 weights_only 参数
# tokenizer = BertTokenizer.from_pretrained(r'./pretrained_transformers/chinese-roberta-wwm-ext/')
# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# model.to(device)
# model.eval()
# return model, tokenizer, label_encoder, device
# 加载模型和分词器 相比原版改进了 weights_only=True 参数是非法的。torch.load 不支持该参数。
def load_model_and_tokenizer():
# save_path = r'./model/模型参数/实物型解析/全部样本三轮_参数_20240829_212116.pth'
save_path = r'./autodl-tmp/model/模型参数/实物型解析/全部样本三轮_参数_20240829_212116.pth'
# label_encoder_path = r'./model/模型参数/实物型解析/label_encoder_3.pkl'
label_encoder_path = r'./autodl-tmp/model/模型参数/实物型解析/label_encoder_3.pkl'
# 加载标签编码器
label_encoder = joblib.load(label_encoder_path)
# 加载预训练模型
model = BertForSequenceClassification.from_pretrained(
r'./autodl-tmp/pretrained_transformers/chinese-roberta-wwm-ext/',
num_labels=len(label_encoder.classes_)
)
# 加载模型权重
model.load_state_dict(torch.load(save_path, map_location=torch.device('cpu')))
# 加载分词器
tokenizer = BertTokenizer.from_pretrained(r'./autodl-tmp/pretrained_transformers/chinese-roberta-wwm-ext/')
# 设置设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
model.eval() # 设置模型为评估模式
return model, tokenizer, label_encoder, device
def predict_batch(df, model, tokenizer, label_encoder, device):
"""
对每一批次的数据进行预测,并处理 NaN 值。
"""
predicted_labels = []
for text in df['prod_name']:
# 将 NaN 值转换为空字符串
if pd.isna(text):
text = ""
inputs = tokenizer.encode_plus(
text,
None,
add_special_tokens=True,
max_length=64,
padding='max_length',
truncation=True,
return_token_type_ids=True,
return_attention_mask=True,
return_tensors='pt'
)
input_ids = inputs['input_ids'].to(device)
attention_mask = inputs['attention_mask'].to(device)
token_type_ids = inputs['token_type_ids'].to(device)
with torch.no_grad():
outputs = model(input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)
logits = outputs.logits
predicted_class_id = torch.argmax(logits, dim=1).item()
predicted_class_label = label_encoder.inverse_transform([predicted_class_id])[0]
predicted_labels.append(predicted_class_label)
return predicted_labels
import os
# 指定要使用的显卡
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 检查 GPU 可用性并打印设备信息
if torch.cuda.is_available():
for i in range(torch.cuda.device_count()):
print(f"GPU {i}: {torch.cuda.get_device_name(i)}")
print(f"Initial Memory Allocated: {torch.cuda.memory_allocated(i)/1024**2:.2f} MB")
print(f"Initial Memory Cached: {torch.cuda.memory_reserved(i)/1024**2:.2f} MB")
else:
print("No GPU available. Using CPU.")
# 加载模型、分词器等
model, tokenizer, label_encoder, device = load_model_and_tokenizer()
app = FastAPI()
# 定义输入和输出格式
class TextRequest(BaseModel):
text: str
class TextResponse(BaseModel):
label: str
confidence: float
import logging
# 设置日志
logging.basicConfig(level=logging.INFO)
@app.post("/classify", response_model=TextResponse)
def classify_text(request: TextRequest):
try:
logging.info(f"Received text: {request.text}")
# 预处理输入文本
inputs = tokenizer(
request.text,
return_tensors="pt",
truncation=True,
padding=True,
max_length=64
)
inputs = {k: v.to(device) for k, v in inputs.items()} # 移动张量到模型设备
# 禁用梯度计算
with torch.no_grad():
outputs = model(**inputs)
probs = torch.nn.functional.softmax(outputs.logits, dim=-1)
confidence, label_id = torch.max(probs, dim=1)
# 解码标签
predicted_label = label_encoder.inverse_transform([label_id.item()])[0]
return TextResponse(label=predicted_label, confidence=confidence.item())
except Exception as e:
logging.error(f"Error: {str(e)}")
raise HTTPException(status_code=500, detail=f"Error processing text: {str(e)}")
# 启动服务
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
将autudl端口映射到本地
方法一:(图形化界面)
配置结果如下图:

方法二:SSH(待更新)
启动服务

服务启动成功

实现api访问(有问题待解决)
curl 测试
powershell测试失败:
curl.exe -X POST "http://127.0.0.1:8000/classify" `
-H "Content-Type: application/json" `
-d "{\"text\": \"这是一段测试文本\"}"
返回错误:待解决

python实现
更多推荐
所有评论(0)