工程初探AI模型服务化部署思想

写完上一篇博客后,心里总是想要探索一下,之前部署模型都是直接丢进AI平台里面部署(接触的也不多),然后用http调用就行了。然后对自己而言python web 的就是flask /FastAPI ,然后用torch serve 部署的时候发现是java,作为一个java 工程师,那种暗暗的开心是很难描述的。所以就想探索一下模型服务 部署的多种方式。感谢deepseek ,以下都是由deepseek回答的问题,我只是一个知识的传播者~

1. 模型训练与序列化(Python 侧)
训练模型:使用 PyTorch(Python)训练深度学习模型。

序列化模型:
TorchScript 导出:将 PyTorch 模型转换为 TorchScript(一种中间表示格式):

model = torch.jit.script(model)  # 或 torch.jit.trace
model.save("model.pt")

注意:.pth 和 .pt 文件扩展名通常用于表示保存的模型权重或整个模型的状态字典(state dictionary)。实际上,这两种扩展名没有本质的区别,它们都是用来存储使用 torch.save() 函数保存的模型或者检查点。选择哪种扩展名更多是出于习惯和项目的约定,而不是技术上的限制。

ONNX 导出(可选):通过 ONNX 格式实现跨框架兼容:

torch.onnx.export(model, input, "model.onnx")

2. 模型部署与跨语言调用
方案 1:基于 API 的服务化部署(推荐)
Python 服务端:

1.使用 Flask/FastAPI 或 gRPC 启动一个 HTTP/gRPC 服务,加载 PyTorch 模型。

2.接收 Java 客户端的请求,在 Python 进程中执行推理,返回结果。

# Flask 示例
from flask import Flask, request
import torch

app = Flask(__name__)
model = torch.jit.load("model.pt")

@app.route("/predict", methods=["POST"])
def predict():
    input_data = request.json["data"]
    output = model(torch.tensor(input_data))
    return {"result": output.tolist()}

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

Java 客户端:
使用 HTTP 客户端(如 OkHttp)或 gRPC 调用 Python 服务:

// OkHttp 示例(Java)
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(MediaType.parse("application/json"), "{\"data\": [...]}");
Request request = new Request.Builder().url("http://localhost:5000/predict").post(body).build();
Response response = client.newCall(request).execute();
String result = response.body().string();

方案 2:通过 JNI 直接调用(高性能场景)
LibTorch C++ 集成:
1.使用 LibTorch(PyTorch 的 C++ 库)加载 TorchScript 模型。
2.通过 Java Native Interface (JNI) 封装 C++ 接口,供 Java 调用。

// C++ JNI 示例
#include <torch/script.h>
#include <jni.h>

extern "C" JNIEXPORT jfloatArray JNICALL
Java_com_example_Model_predict(JNIEnv *env, jobject obj, jfloatArray input) {
    torch::jit::script::Module model = torch::jit::load("model.pt");
    // 推理逻辑
    return output_array;
}

Java 调用:

public class Model {
    static { System.loadLibrary("native_model"); }
    public native float[] predict(float[] input);
}

3. 关键技术与工具
1.TorchScript:PyTorch 的序列化格式,支持脱离 Python 环境运行。
2.ONNX Runtime:跨平台推理引擎,Java 可通过 ONNX Runtime 直接加载 .onnx 模型。
3.gRPC:高性能跨语言 RPC 框架,支持自动生成 Java/Python 代码。
4.Apache Arrow:内存数据格式,用于高效跨语言数据交换。

4. 流程总结
Python 侧:训练模型 → 序列化为 TorchScript/ONNX → 启动服务或导出接口。

Java 侧:
1.服务化调用:通过 HTTP/gRPC 发送请求,Python 服务返回结果。
2.本地调用:通过 JNI 或 ONNX Runtime 直接加载模型推理。

5. 性能权衡
方案 优点 缺点
API 服务化
部署简单,支持热更新
网络延迟,需维护服务

JNI + LibTorch
高性能,无网络开销
需编译 C++ 代码,复杂度高

ONNX Runtime
跨框架兼容,Java 直接调用
模型转换可能有算子不支持

6. 推荐实践
快速验证:使用 Flask/FastAPI + HTTP 客户端。

生产环境:gRPC + 服务化部署(如 TorchServe)。

嵌入式/移动端:ONNX Runtime 或 LibTorch + JNI。

如果需要进一步优化 Java 侧的推理性能,可结合 DeepLearning4J(支持加载 ONNX/PyTorch 模型)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_Octopus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值