问题描述
有没有可能,有人可以发布一个包含 spacy 和语言模型的 最小 程序的工作 pyinstaller 示例?
我尝试遵循 stackoverflow 上的提示,但也许我不太了解它们。我仍然遇到同样的错误,找不到模型。
解决方法
我能够使用 PyInstaller 使用 Spacy 2.x 来打包我的“预测服务器”,但是需要大量的试验才能使所有“钩子”正确。 我的预测服务器加载 NR 模型并侦听(在套接字上)预测请求(数据)。对于每个请求,它返回预测的 NR 实体。
我的服务器在不使用 GPU 的情况下工作。添加 GPU 支持导致了一个巨大的可执行文件,它总是缺少一些东西 - 更不用说它可能只能移植到具有相同 CUDA 版本的机器上。
我的 SpacyServer.spec:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['SpacyServer.py'],pathex=['C:\\Work\\ML\\Spacy\\deploy'],binaries=[],datas=[],hiddenimports=[],hookspath=['.'],runtime_hooks=[],excludes=['cupy'],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)
pyz = PYZ(a.pure,a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,[],name='SpacyServer',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=True )
还有我的 hook-spacy.py:
# HOOK FILE FOR SPACY
from PyInstaller.utils.hooks import collect_all
# ----------------------------- SPACY -----------------------------
print('=================== SPACY =====================')
data = collect_all('spacy')
datas = data[0]
binaries = data[1]
hiddenimports = data[2]
# ----------------------------- THINC -----------------------------
data = collect_all('thinc')
datas += data[0]
binaries += data[1]
hiddenimports += data[2]
# ----------------------------- CYMEM -----------------------------
data = collect_all('cymem')
datas += data[0]
binaries += data[1]
hiddenimports += data[2]
print(data[2])
# ----------------------------- PRESHED -----------------------------
data = collect_all('preshed')
datas += data[0]
binaries += data[1]
hiddenimports += data[2]
# ----------------------------- BLIS -----------------------------
data = collect_all('blis')
datas += data[0]
binaries += data[1]
hiddenimports += data[2]
# ----------------------------- OTHER ----------------------------
hiddenimports += ['srsly.msgpack.util']
# This hook file is a bit of a hack - really,all of the libraries should be in seperate hook files. (Eg hook-blis.py with the blis part of the hook)
# But it looks we need to process everything when we import spacy,else we do not even hit import cymem.
print('=================== SPACY DONE =====================')
最后,我跑了:
pyinstaller --onefile --name SpacyServer SpacyServer.py --additional-hooks-dir=. --exclude-module=cupy