1. 准备Debian基础环境
确保Debian系统已更新并安装Python、pip及GPU驱动(若使用CUDA加速):
sudo apt update && sudo apt upgrade -y
sudo apt install python3 python3-pip python3-venv -y
# 若使用NVIDIA GPU,安装对应驱动及CUDA工具包(参考PyTorch官网CUDA版本要求)
验证Python版本(建议Python 3.7+)及pip是否可用:
python3 --version
pip3 --version
2. 安装PyTorch
根据系统CUDA版本选择合适的PyTorch安装命令(以CUDA 12.2为例):
pip3 install torch torchvision torchaudio
nvidia-smi显示的CUDA版本):pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu122
注:若使用conda环境,可通过
conda install pytorch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 pytorch-cuda=12.2 -c pytorch -c nvidia安装。
3. 准备与优化模型
.pth文件(需包含模型结构和参数):import torch
from model import MyModel # 替换为你的模型定义文件
model = MyModel()
torch.save(model.state_dict(), 'model.pth')
1x3x224x224),导出为ONNX:import torch
import torchvision.models as models
model = models.resnet18(pretrained=True).eval() # 替换为你的模型
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, "model.onnx", verbose=True)
4. 部署模型(选择合适方式)
适用于快速测试,无需额外服务:
import torch
from model import MyModel # 替换为你的模型定义文件
# 加载模型(CPU/GPU)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = MyModel().to(device)
model.load_state_dict(torch.load('model.pth', map_location=device))
model.eval()
# 准备输入(替换为实际数据,如图像预处理后的张量)
input_data = torch.randn(1, 3, 224, 224).to(device) # 示例输入
# 推理
with torch.no_grad():
output = model(input_data)
print("Output:", output)
适用于通过网络提供API接口:
from flask import Flask, request, jsonify
import torch
from model import MyModel # 替换为你的模型定义文件
app = Flask(__name__)
# 加载模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = MyModel().to(device)
model.load_state_dict(torch.load('model.pth', map_location=device))
model.eval()
# 定义推理接口
@app.route('/predict', methods=['POST'])
def predict():
# 获取JSON输入(假设输入为列表形式的numpy数组)
data = request.json['input']
input_tensor = torch.tensor(data).unsqueeze(0).to(device) # 添加batch维度
# 推理
with torch.no_grad():
output = model(input_tensor)
# 返回JSON结果
return jsonify({'output': output.tolist()})
# 启动服务
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
运行服务:python3 app.py,通过curl或Postman测试:
curl -X POST http://localhost:5000/predict -H "Content-Type: application/json" -d '{"input": [[...]]}'
适用于生产环境的高效模型管理:
# 安装TorchServe
pip3 install torchserve torch-model-archiver
# 打包模型(生成model.mar文件)
torch-model-archiver --model-name mymodel --version 1.0 --serialized-file model.pth --handler image_classifier # 若为自定义模型,需替换handler
# 启动TorchServe
torchserve --model-store . --models mymodel=mymodel.mar --ncs # --ncs启用NVIDIA CUDA加速
测试API:
curl -X POST http://localhost:8080/predictions/mymodel -T input.json # input.json需符合模型输入格式
适用于高性能场景(如嵌入式设备或C++项目):
import torch
from model import MyModel
model = MyModel().eval()
example_input = torch.randn(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example_input)
traced_script_module.save("model_traced.pt")
#include <torch/script.h>
#include <iostream>
#include <memory>
int main(int argc, const char* argv[]) {
if (argc != 2) {
std::cerr << "Usage: example-app <path-to-exported-script-module>\n";
return -1;
}
// 加载模型
torch::jit::script::Module module;
try {
module = torch::jit::load(argv[1]);
}
catch (const c10::Error& e) {
std::cerr << "Error loading the model\n";
return -1;
}
std::cout << "Model loaded successfully\n";
// 准备输入
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::randn({1, 3, 224, 224})); // 示例输入
// 推理
at::Tensor output = module.forward(inputs).toTensor();
std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n'; // 打印前5个输出
return 0;
}
CMakeLists.txt:cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(pytorch_deploy)
find_package(Torch REQUIRED)
add_executable(example-app main.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)
编译并运行:mkdir build && cd build
cmake -DCMAKE_PREFIX_PATH=/usr/local/lib/python3.10/dist-packages/torch ..
make
./example-app ../model_traced.pt
5. 测试与验证
无论选择哪种部署方式,均需通过实际输入数据验证模型输出是否符合预期。例如,使用测试图像输入,对比部署前后的预测类别或数值差异,确保模型功能正常。