pytorch使用pyinstaller编译报错:找不到源代码
pytorch使用pyinstaller编译报错:找不到源代码
错误:PyInstaller OsError: Can’t get source code TorchScript
参考来源: https://github.com/pyinstaller/pyinstaller/issues/5673
对于那些遇到同样错误的人,我不得不使用一些技巧来使其正常工作。我将尝试为此提供指南。
请注意,前两个步骤不起作用。所以你可能想直接进入第 3 步。
解决方案指南
我做的第一件事就是修改我的.spec文件以包含这个来获取torch源代码:
def collect_source_files(modules):datas = []for module in modules:source = inspect.getsourcefile(module)dest = f"src.{module.__name__}" # use "src." prefixdatas.append((source, dest))return datassource_files = collect_source_files([torch]) # return same structure as `collect_data_files()`
source_files_toc = TOC((name, path, 'DATA') for path, name in source_files)
# ...
# your Analysis settings untouched
# ...
pyz = PYZ(a.pure, a.zipped_data, source_files_toc, cipher=block_cipher)
# rest of the file
# ...
然后修改FrozenImporter(pyimod03_importers.py)为:
class FrozenImporter(object):`...def get_source(self, fullname):"""Method should return the source code for the module as a string.But frozen modules does not contain source code.Return None."""if fullname in self.toc:sourcename = f"src.{fullname}"if sourcename in self.toc:return self._pyz_archive.extract(sourcename)[1].decode("utf-8")return Noneelse:# ImportError should be raised if module not found.raise ImportError('No module named ' + fullname)
为了做到这一点,我必须
git clone https://github.com/pyinstaller/pyinstaller.git- 更改文件
pyinstaller/PyInstaller/loader/pyimod03_importers.py以包含上述源代码。- 运行
pip install -e ./pyinstaller。现在我有了Pyinstaller的更新版本。但这给了我同样的错误。- 我从
PyTorch问题板上的这篇文章中发现,@torch.jit.scipttransformers模块中函数(原始错误消息中输出的函数)的注释transformers/models/deberta/modeling_deberta.py存在c2p_dynamic_expand问题,必须将其更改为。@torch.jit._script_if_tracing所以我照做了。我按照与步骤2中对PyInstaller所做的类似方式执行了此操作FrozenImporter:
git clone https://github.com/huggingface/transormers.git- 更改函数
c2p_dynamic_expand以transformers/transformers/deberta/modeling_deberta.py使用新的@torch.jit._script_if_tracing注释。- 以
root身份运行pip install -e ./transformer。现在我有了transformer的更新版本,错误也消失了。
