我在 s3(未壓縮)上托管了一個預訓練的 fasttext 模型,我試圖將它加載到 lambda 函式中。我正在使用該gensim.models.fasttext模塊來加載模型:
from gensim.models.fasttext import load_facebook_vectors
def load_model(obj):
model = load_facebook_vectors(obj["path"])
是obj["path"]s3 路徑,但我不斷收到以下錯誤:
"errorMessage": "fileno"
"errorType": "UnsupportedOperation"
"stackTrace": [
...
" File \"/var/task/gensim/models/fasttext.py\", line 784, in load_facebook_vectors\n full_model = _load_fasttext_format(path, encoding=encoding, full_model=False)\n"
" File \"/var/task/gensim/models/fasttext.py\", line 808, in _load_fasttext_format\n m = gensim.models._fasttext_bin.load(fin, encoding=encoding, full_model=full_model)\n"
" File \"/var/task/gensim/models/_fasttext_bin.py\", line 348, in load\n vectors_ngrams = _load_matrix(fin, new_format=new_format)\n"
" File \"/var/task/gensim/models/_fasttext_bin.py\", line 282, in _load_matrix\n matrix = np.fromfile(fin, _FLOAT_DTYPE, count)\n"
]
uj5u.com熱心網友回復:
不幸的是,np.fromfile()此負載所依賴的方法不適用于從 S3 流式傳輸的檔案。
一些替代選項包括:
- 首先將 S3 檔案下載到本地路徑,然后
load_facebook_vectors()從那里使用;或者… - 在本地擁有 FastText 檔案時,在本地加載它,然后使用 Python 的
pickle功能將其保存到單個檔案(現在是 Python 的格式),然后將該檔案放在 S3 上,并在將來使用 Python 的 unpickling 重新加載它
gensim.utils pickle()and中的實用程式函式unpickle()(采用檔案路徑,包括 S3 URL)可能對第二個選項有幫助,例如:
https://radimrehurek.com/gensim/utils.html#gensim.utils.unpickle
由于您之前的代碼僅顯示使用向量(通過.load_facebook_vector),而不是整個模型,您可以只腌制和上傳model.wv加載模型的子組件,而不是整個模型,以節省一些存盤/帶寬。
如果可能在未來的 Gensim 版本中,與FastText-model 相關的類的形狀/操作發生變化,那么舊的腌制模型可能無法完全加載。在這種情況下,您可能會:
- 回傳原始 Facebook 格式的模型檔案(然后可以加載,然后再次以現代格式重新保存);或者...
- 將腌制模型加載到它作業的較舊的 Gensim 中,使用 Gensim 的本機將其保存在本地
.save()(可能將其拆分為多個本地檔案),然后在較新的 Gensim 中使用 Gensim 的本機FastText.load()加載那些較舊的檔案(通常會處理較舊的格式) ,然后重新腌制加載的模型,以便將來重新解壓縮到匹配的最新 Gensim 中。
uj5u.com熱心網友回復:
load_facebook_vectors的檔案說:
此函式使用 smart_open 庫打開路徑。該路徑可能在遠程主機上(例如 HTTP、S3 等)。
smart_open有訪問 S3 物件的示例。我沒有親自嘗試過,但我想確保您在決定強制下載物件并在本地訪問它之前消除了所有選項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/422509.html
標籤:
