如何用 Java 直接调用 Python 模型 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qinfengge
V2EX    Java

如何用 Java 直接调用 Python 模型

  •  
  •   qinfengge 2023-08-21 15:55:57 +08:00 3938 次点击
    这是一个创建于 781 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先排除 API 的方式 一种是用 python 导出模型然后用 DJL(deep java Library)直接调用,但需要转译 还有一种是命令行调用,还不如 API 呢

    大佬们还有没有其它方法能够直接调用 python 导出的模型,类似安卓调模型?

    22 条回复    2023-08-22 16:59:56 +08:00
    ruanimal
        1
    ruanimal  
       2023-08-21 15:57:44 +08:00
    PMML
    qinfengge
        2
    qinfengge  
    OP
       2023-08-21 16:07:53 +08:00
    @ruanimal 简单看了下,如果模型需要的入参是文件,比如图片应该怎么搞?
    ruanimal
        3
    ruanimal  
       2023-08-21 16:12:39 +08:00
    这个得看你具体的模型框架,不太熟这块
    qinfengge
        4
    qinfengge  
    OP
       2023-08-21 16:14:43 +08:00
    @ruanimal #3 好的,感谢
    o562dsRcFqYl375i
        5
    o562dsRcFqYl375i  
       2023-08-21 17:22:07 +08:00
    仅供参考:
    1. 相应模型框架的 Java bindings ,将模型直接内嵌到 Java 应用程序中
    2. TF-Serving 、triton server 这类推理服务,Java 和 模型之间走 RESTful 或者 gRPC (某些对框架有要求,比如 TFS )
    3. ONNX 、PMML 这类
    astkaasa
        6
    astkaasa  
       2023-08-21 17:35:08 +08:00
    mark 一下, 可能有需求
    xiaodi666
        7
    xiaodi666  
       2023-08-21 17:50:47 +08:00
    类似于 flink 调 Python 写的算子?
    SimonOne
        8
    SimonOne  
       2023-08-21 17:53:10 +08:00
    @huangzongzhuan #5 你这字咋变色的,也不是代码块啊
    David1119
        9
    David1119  
       2023-08-21 17:54:38 +08:00
    pemja ?
    pannanxu
        10
    pannanxu  
       2023-08-21 17:55:04 +08:00
    以前做过这个。用的是 Runtime.getRuntime().exec()。
    kopnux
        11
    kopnux  
       2023-08-21 18:06:54 +08:00
    用 python 的 web 框架搞 flask django 等
    OysterQAQ
        12
    OysterQAQ  
       2023-08-21 20:08:55 +08:00
    tf 模型就用 TF-Serving (拥有 batch 能力,图模式执行效率高),pytorch 方案很多,尽量找支持 batch 的,要不就自己用 web 实现一个
    zjp
        13
    zjp  
       2023-08-21 22:34:44 +08:00
    用过 PMML ,最后还是选择了 Http 调用
    不用考虑兼容性舒服多了,除了接口定义,两端可以独立开发
    SmileDup
        14
    SmileDup  
       2023-08-21 23:11:54 +08:00
    把最基础的功能(比如 llm 的对话)封装成一个 flask 服务器,暴露一个 restapi ,然后就跟调 api 一样
    dayeye2006199
        15
    dayeye2006199  
       2023-08-22 00:39:10 +08:00 via Android
    Onnx 转译。Java 里面调用 onnxruntime 把模型读进来。
    但是有些算子是不支持的。

    好奇为啥不通过 API 通讯
    jingcjie
        16
    jingcjie  
       2023-08-22 01:48:48 +08:00 via Android   1
    折腾过各种,cpp ,tensort ,java ,kotlin ,你只要模型能生成 onnx ( pytorch 和 tf 都可以直接搞),java 爱怎么用怎么用,但现在很多复杂模型导 onnx 很麻烦,要改模型里的操作,甚至重训。
    dcsuibian
        17
    dcsuibian  
       2023-08-22 03:10:56 +08:00 via Android
    grpc
    k1263
        18
    k1263  
       2023-08-22 09:47:16 +08:00
    老 Java JNI ,新 Java FFI
    qinfengge
        19
    qinfengge  
    OP
       2023-08-22 09:58:03 +08:00
    感谢各位大佬,找到了一个 onnx 不错的 demo
    https://gitee.com/agricultureiot/yolo-onnx-java
    Dockerfile
        20
    Dockerfile  
       2023-08-22 11:11:43 +08:00
    用 jni 调
    zhangdahai
        21
    zhangdahai  
       2023-08-22 11:31:10 +08:00
    直接 java
    ZiChun
        22
    ZiChun  
       2023-08-22 16:59:56 +08:00
    如果你的服务器上有 python 环境,那么有个非常方便的方案,什么都不用做。
    ProcessBuilder processBuilder = new ProcessBuilder("/usr/bin/python3.11", "/path/to/python.py");
    try {
    Process process = processBuilder.start();
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
    String line;
    while ((line = reader.readLine()) != null) {
    // 你的逻辑
    }
    }
    int exitCode = process.waitFor();
    System.out.println("Exited with error code : " + exitCode);
    } catch (IOException | InterruptedException e) {
    System.err.println("An error occurred while executing the process: " + e.getMessage());
    }
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3630 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 00:48 PVG 08:48 LAX 17:48 JFK 20:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86