之前我们学习了在和鲸的预配置好的平台上进行学习,在工作中并不现实,本期我们的目标是将已有模型部署到云端进行运行

配置环境:RTX 4090D(24GB) python 3.12(ubuntu22.04)

参考文章:AutoDL平台transformers环境搭建

注册及选择算力

首先登录官网完成注册

注册之后在算力市场找自己需要的显卡配置:
在这里插入图片描述
选择好显卡配置后,点击立即创建
在这里插入图片描述
创建后如图所示可以看到自己的实例,开机后点击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实现

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐