Nuitka打包PyTorch项目

前提概要

最近的暑期课程需要实现一个人脸检测,并做成有图形用户界面的软件,和队友商量后,决定我将核心部件——人脸检测封装成一个命令行工具。于是乎,我就有了将PyTorch项目打包成可执行文件的应用需求,关于Python打包,常用的工具包有Pyinstaller和Nuitka。由于Nuitka给我感觉更佳,于是乎,这篇文章就探讨如何将比较大的PyTorch项目打包成可执行文件。

当然,pytorch本身提供了一套成熟的部署方案,但是最近没时间去学


Nuitka的安装

具体安装过程可以看看这篇文章:Python打包exe的王炸-Nuitka

安装完后,打开命令行,输入:

$nuitka -h

如果可以跳出nuitka的相关参数信息,那就说明安装成功了。


打包PyTorch项目

前排提示,请确保你的numpy的版本为1.16.*,否则,最终的软件会报错:

ImportError: numpy.core.multiarray failed to import

为了一些不必要的麻烦,你可以通过脚本将项目缩成一个文件,在确保这单个Python文件可以运行后,开始我们的打包过程,我的人脸检测文件名为F_Detection.py。由于nuitka的参数比较多,所以我打算通过Python脚本来运行nuitka,我们在同目录下新建一个文件build.py,内容如下:

import os 

def __main(main : str):
    parameters = [
        '--mingw64',				# 使用gcc编译器来编译得到的C和C++源文件
        '--standalone',				# 构建独立软件,也就是将于系统有关的运行库和Python运行时打包
        '--show-progress',			# 展示打包过程
        '--show-memory',			# 打印打包时的内存占用
        '--nofollow-imports',		# 不打包import语句导入的包(因为nuitka自动导入的库有问题,后面我们会手动导入,这样成功率更高)
        '--plugin-enable=pylint-warnings',
        '--output-dir=dist'			# 存放构建结果的文件夹
    ]

    param_str = " ".join(parameters)
    command = "nuitka {} {}".format(param_str, main)

    os.system(command)

__main("F_Detection.py")

运行该文件,打包过程就会开始。打包过程中,控制台截图如下。
在这里插入图片描述

10秒之内就能打包完成。打开存放构建结果的dist文件夹,内容如下:
在这里插入图片描述
其中的F_Detection.dist就是最终的结果,完成后面的操作后,F_Detection.dist就是一个独立的软件包了。而F_Detection.build中则存放了构建过程中python转成的C源文件,你可以删掉。下面我们通过trial and error的方法来补充软件包缺失的第三方库依赖。

我们在./dist/F_Detection.dist下打开命令行,输入.\F_Detection
在这里插入图片描述
提示缺少pywin32_bootstrap,打开我们的Python解释器的目录,也就是这个:
在这里插入图片描述

找到了吗?然后我们去找这个依赖,打开./Lib/site-packages,你所有安装的第三方库的Python源码都在这个文件夹下,这也是我们在补充构建软件的第三方库是频繁光顾的地方,请记住它的位置。

在这里插入图片描述

然后找到./win32/lib/pywin32_bootstrap.py,把它复制粘贴到F_Detection.dist中。然后继续:

在这里插入图片描述
发现这次是torch缺了,那么我们就去site-packages里把torch搬过来:

在这里插入图片描述
我们继续试图运行:
在这里插入图片描述
一样的,将你的版本为1.1.6.*的numpy包从site-packages拷贝到软件包中。继续:
在这里插入图片描述
原来是少了typing_extensions.py,这是python3.7的新特性,我还是加一下吧,这个文件就在site-packages中,拷贝之。继续尝试:
在这里插入图片描述
拷贝cv2,继续:
在这里插入图片描述
pytorch的模型文件没有加进来,拷贝一下model.pth到软件包中,继续:
在这里插入图片描述
成功了,程序成功返回了bounding box。将F_Detection.dist改个名字(如果你愿意),那么一个可以在Windows操作系统上分发的软件包就制作完成啦。


总结

不要太相信Nuitka的自动打包参数(PyQt5的还可以的),试了一些以后发现,最稳妥的打包方式就是用最基础的打包参数(记住一定要加入--nofollow-imports参数)打包后,自己手动搬运第三方库以及第三方依赖(比如图片,模型文件,数据库文件)

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于使用PyInstaller打包PyTorch GPU代码的问题,有一些注意事项和解决办法。首先,确保你的环境中已经正确安装了PyTorch和CUDA,并且你的代码可以在GPU上正常运行。 一个常见的问题是PyInstaller无法正确处理PyTorch GPU相关的依赖项。为了解决这个问题,你可以尝试以下方法: 1. 使用PyInstaller的`--hidden-import`选项来显式地导入一些PyTorch GPU相关的模块。例如,你可以尝试导入`torch.cuda`、`torch.backends.cudnn`和`torch.backends.cuda`等模块。这样可以确保PyInstaller能够正确地处理这些依赖项。 2. 另一种方法是在打包之前,将PyTorch的GPU支持关闭,将代码切换到使用CPU进行推理。这样一来,PyInstaller就不会再涉及与GPU相关的问题。你可以在代码中添加一些逻辑,当检测到没有GPU时,切换到CPU推理模式。 3. 如果以上方法都无法解决问题,你还可以尝试使用其他的打包工具,比如PyOxidizer或Nuitka。这些工具可能对于打包PyTorch GPU代码更加友好。 总之,在打包PyTorch GPU代码时,需要注意PyInstaller对于GPU相关的依赖项的处理。通过显式导入相关模块、关闭GPU支持或尝试其他打包工具,你应该能够解决打包问题。记得在打包之前,进行充分的测试以确保代码在不同环境中的正常运行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Pyinstaller打包Pytorch框架](https://blog.csdn.net/qq_42811827/article/details/124035548)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [windows pyinstaller打包pytorch程序到exe文件](https://blog.csdn.net/whunamikey/article/details/121286772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值