You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyInstaller打包含JIT的PyTorch(依赖Triton)代码时运行报错的解决方案咨询

PyInstaller打包含JIT的PyTorch(依赖Triton)代码时运行报错的解决方案咨询

看起来你遇到的是PyInstaller打包依赖Triton JIT的项目时的典型问题——Triton的JIT编译器需要读取原始Python源码来生成内核,但PyInstaller默认会把Python模块打包成字节码归档(PYZ文件),这导致inspect.getsourcelines无法获取到源码内容,从而抛出OSError。结合你的环境(sglang、Ubuntu、PyInstaller 6.14.1、Python 3.10.12),这里有几个可以尝试的解决方案:


方案1:全局禁用模块归档(最直接有效)

修改你的spec文件,将Analysis部分的noarchive参数设为True,这样PyInstaller不会把Python模块打包进PYZ归档,而是保留为单独的.py文件,让inspect模块能正常读取源码:

a = Analysis(
    ['python/sglang/launch_server.py'],
    pathex=[],
    binaries=[],
    datas=datas,
    hiddenimports=['triton'],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=True,  # 修改此处为True
    optimize=0,
)

注意:这个方法会让打包后的体积变大,启动速度略有下降,但能彻底解决JIT依赖源码的问题,是最推荐的尝试方向。


方案2:Monkey Patch inspect模块规避源码检查

如果不想全局禁用归档,可以写一个运行时钩子(runtime hook),替换inspect.getsourcelines函数,当遇到Triton的JIT函数时返回模拟的源码内容,避免抛出错误:

  1. 创建一个名为runtime_hook.py的文件,内容如下:
import inspect
import types

original_getsourcelines = inspect.getsourcelines

def patched_getsourcelines(obj):
    # 针对Triton JIT函数返回假的源码(标记有__triton_jit__属性的函数)
    if isinstance(obj, types.FunctionType) and hasattr(obj, '__triton_jit__'):
        return (['def dummy_triton_func(): pass'], 1)
    # 其他情况尝试调用原始方法,失败则返回默认值
    try:
        return original_getsourcelines(obj)
    except OSError:
        return (['def fallback_func(): pass'], 1)

inspect.getsourcelines = patched_getsourcelines
  1. 在你的spec文件中添加这个运行时钩子:
a = Analysis(
    ['python/sglang/launch_server.py'],
    # ... 其他参数保持不变
    runtime_hooks=['./runtime_hook.py'],  # 添加此行
    # ...
)

注意:这个方法可能会影响Triton某些依赖源码行号的功能,需要测试验证兼容性。


方案3:更全面地收集Triton的文件

虽然你已经用了collect_data_files,但可以尝试扩展收集范围,确保Triton的所有源码和模板文件都被正确打包:

修改spec文件中的datas部分:

from PyInstaller.utils.hooks import collect_data_files
import triton
import os

datas = []
# 收集Triton的所有Python文件和内核模板
datas += collect_data_files('triton', include_py_files=True, includes=['**/*.py', '**/*.pyi', '**/*.h', '**/*.cu'])
datas += collect_data_files('torchvision', include_py_files=True)

# 添加Triton的安装路径到pathex,帮助PyInstaller定位文件
a = Analysis(
    ['python/sglang/launch_server.py'],
    pathex=[os.path.dirname(triton.__file__)],
    # ... 其他参数保持不变
)

这个方法确保Triton的所有必要文件都被打包到正确路径,让运行时能找到源码文件。


建议先尝试方案1,因为它最直接且兼容性最好。如果体积问题无法接受,再尝试方案2或3。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:28:04