簡體   English   中英

將 spacy model 保存並加載到谷歌雲存儲桶

[英]Save and load a spacy model to a google cloud storage bucket

我有一個 spacy model,我正在嘗試使用這種格式將它保存到 gcs 桶中

trainer.to_disk('gs://{bucket-name}/model')

但是每次我運行這個我都會收到這個錯誤信息

FileNotFoundError: [Errno 2] No such file or directory: 'gs:/{bucket-name}/model'

此外,當我創建一個 kubeflow 持久卷並將 model 保存在那里時,我可以使用trainer.load('model')下載 model 我收到此錯誤消息

File "/usr/local/lib/python3.7/site-packages/spacy/__init__.py", line 30, in load
    return util.load_model(name, **overrides)
  File "/usr/local/lib/python3.7/site-packages/spacy/util.py", line 175, in load_model
    raise IOError(Errors.E050.format(name=name))
OSError: [E050] Can't find model '/model/'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory.

我不明白為什么我會遇到這些錯誤,因為當我在我的電腦上本地運行它並使用本地路徑時,它工作得很好。

雲存儲不是本地磁盤或物理存儲單元,您可以將內容直接保存到其中。

正如你所說

這在我本地的電腦上並使用本地路徑

雲存儲實際上不是雲中任何其他工具的本地路徑

如果您使用的是 python,則必須使用 Storage 庫創建客戶端,然后使用 upload_blob 上傳文件,即:

from google.cloud import storage


def upload_blob(bucket_name, source_file_name, destination_blob_name):
"""Uploads a file to the bucket."""
# bucket_name = "your-bucket-name"
# source_file_name = "local/path/to/file"
# destination_blob_name = "storage-object-name"

storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(destination_blob_name)

blob.upload_from_filename(source_file_name)

既然您已將此問題標記為“kubeflow-pipelines”,我將從這個角度回答。

KFP 力求與平台無關。 大多數好的組件都是獨立於雲的。 KFP 促進系統管理的工件傳遞,其中組件代碼僅將 output 數據寫入本地文件,系統將其獲取並使其可用於其他組件。

因此,最好以這種方式描述您的 SpaCy model 訓練器 - 將數據寫入本地文件。 檢查所有其他組件的工作方式,例如Train Keras 分類器

由於您要上傳到 GCS,請明確執行此操作,但將培訓師的 model output 傳遞給“上傳到 GCS”組件:

upload_to_gcs_op = components.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/616542ac0f789914f4eb53438da713dd3004fba4/components/google-cloud/storage/upload_to_explicit_uri/component.yaml')

def my_pipeline():
   model = train_specy_model(...).outputs['model']

   upload_to_gcs_op(
       data=model,
       gcs_path='gs:/.....',
   )

以下實施假定您的計算機中安裝了gsutil 使用的 spaCy 版本是 3.2.4。 就我而言,我希望所有內容都成為(演示)單個 Python 文件spacy_import_export.py的一部分。 為此,我不得不使用subprocess python 庫,加上這個注釋,如下所示:

# spacy_import_export.py
    
import spacy
import subprocess  # Will be used later

# spaCy models trained by user, are always stored as LOCAL directories, with more subdirectories and files in it.
PATH_TO_MODEL = "/home/jupyter/"  # Use your own path!

# Test-loading your "trainer" (optional step)
trainer = spacy.load(PATH_TO_MODEL+"model")

# Replace 'bucket-name' with the one of your own:
bucket_name = "destination-bucket-name"
GCS_BUCKET = "gs://{}/model".format(bucket_name)

# This does the trick for the UPLOAD to Cloud Storage:
# TIP: Just for security, check Cloud Storage afterwards: "model" should be in GCS_BUCKET
subprocess.run(["gsutil", "-m", "cp", "-r", PATH_TO_MODEL+"model", GCS_BUCKET])

# This does the trick for the DOWNLOAD:
# HINT: By now, in PATH_TO_MODEL, you should have a "model" & "downloaded_model"
subprocess.run(["gsutil", "-m", "cp", "-r", GCS_BUCKET+MODEL_NAME+"/*", PATH_TO_MODEL+"downloaded_model"])

# Test-loading your "GCS downloaded model" (optional step)
nlp_original = spacy.load(PATH_TO_MODEL+"downloaded_model")

對於過多的評論,我深表歉意,我只是想為“spaCy 新人”澄清一切。 我知道有點晚了,但希望它能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM