googleapis / googleapis/python-aiplatform

Loading registred model from a Windows machine failed due to wrong separator

オープン
#5,648 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
api: vertex-ai
主要言語
Python
スター
905
フォーク
465
平均マージ
1日 13時間
マージ済み PR(30日)
44

説明

Hello! I've noticed that to load a registered model one construct a path from model uri and the predefined name which is for XGBoost, for example, is `model.bst`. [Like that.](https://github.com/googleapis/python-aiplatform/blob/78c8fddc8fc9a9cc83bf982a572ed3aeaf9b876b/google/cloud/aiplatform/metadata/_models.py#L565)

The problem is when one calls this line from a Windows machine, `os.path.join()` adds a backward slash `\` to the path - but that path is to be utilised in the POSIX file system of GCP. This fails the command with FileNotFound exception. Obviously, it happens only for Windows machine.

Given that by definition load_model() should load a model from GCP servers, would it wise to force a forward slash `/` join on this line?

Like that:
```
# Force forward slash as model will be always loaded from POSIX system of GCP
source_file_uri = model.uri + '/' + model_file
```

#### Environment details

- OS type and version: Windows 11
- Python version: Python 3.12.10
- pip version: pip 25.0.1
- `google-cloud-aiplatform` version: `1.86.0`

#### Steps to reproduce

1. Save (XGBRegressor in my case) model using `aiplatform.save_model()`
2. Using Windows machine, try to load it back using `experiment_model.load_model()`

#### Code example

```python
def save_model(
experiment_name: str,
run_name: str,
project: str,
location: str,
model,
artifact_id: Optional[str] = None,
input_example=None,
display_name: Optional[str] = None,
) -> None:
_, gcs_bucket = get_gcp_bucket_vertex_ai(
project=project,
location=location,
experiment_name=experiment_name,
run_name=run_name,
)
model_uri = f"{gcs_bucket}/models/{display_name}"

aiplatform.init(project=project, location=location)
aiplatform.save_model(
model=model,
artifact_id=artifact_id,
uri=model_uri,
input_example=input_example,
display_name=display_name,
)

def load_experiment_model_sample(
artifact_id: str,
project: str,
location: str,
) -> Union["sklearn.base.BaseEstimator", "xgb.Booster", "tf.Module"]: # noqa: F821:
experiment_model = aiplatform.get_experiment_model(
artifact_id=artifact_id, project=project, location=location
)

return experiment_model.load_model()

a = load_experiment_model_sample('{...redacted...}', config['project'], 'europe-west1')
```

#### Stack trace
```
Cell In[4], [line 15](vscode-notebook-cell:?execution_count=4&line=15)
6 def load_experiment_model_sample(
7 artifact_id: str,
8 project: str,
9 location: str,
10 ) -> Union["sklearn.base.BaseEstimator", "xgb.Booster", "tf.Module"]: # noqa: F821:
11 experiment_model = aiplatform.get_experiment_model(
12 artifact_id=artifact_id, project=project, location=location
13 )
---> [15](vscode-notebook-cell:?execution_count=4&line=15) return experiment_model.load_model()

File {...redacted...}\Lib\site-packages\google\cloud\aiplatform\metadata\schema\google\artifact_schema.py:777, in ExperimentModel.load_model(self)
759 def load_model(
760 self,
761 ) -> Union["sklearn.base.BaseEstimator", "xgb.Booster", "tf.Module"]: # noqa: F821
762 """Retrieves the original ML model from an ExperimentModel.
763
764 Example Usage:
(...) 775 ValueError: if model type is not supported.
776 """
--> [777](file:///{...redacted...}/Lib/site-packages/google/cloud/aiplatform/metadata/schema/google/artifact_schema.py:777) return _models.load_model(self)

File :27, in load_model(model)

File {...redacted...}\Lib\site-packages\google\cloud\aiplatform\utils\gcs_utils.py:301, in download_file_from_gcs(source_file_uri, destination_file_path, project, credentials)
297 source_blob = storage.Blob.from_string(source_file_uri, client=storage_client)
299 _logger.debug(f'Downloading "{source_file_uri}" to "{destination_file_path}"')
--> [301]({...redacted...}/Lib/site-packages/google/cloud/aiplatform/utils/gcs_utils.py:301) source_blob.download_to_filename(filename=destination_file_path)

File ~\python\3.12\Lib\contextlib.py:81, in ContextDecorator.__call__..inner(*args, **kwds)
78 @wraps(func)
79 def inner(*args, **kwds):
80 with self._recreate_cm():
---> [81](https://file+.vscode-resource.vscode-cdn.net/{...redacted...}/model/src/notebooks/~/python/3.12/Lib/contextlib.py:81) return func(*args, **kwds)

....

NotFound: 404 GET https://storage.googleapis.com/download/storage/v1/b/i{...redacted...}5Cmodel.bst?alt=media: No such object: {...redacted...}\model.bst: ('Request failed with status code', 404, 'Expected one of', , )
```

Thanks for considering this!

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。