在Vertex AI Notebook加载GCS中XGBoost .bst模型的问题求助
在Vertex AI Notebook中加载GCS上的XGBoost模型问题汇总及解决方案
我在Vertex AI(Kubeflow)流水线组件中训练XGBoost模型,并将其保存为model.bst文件至Google Cloud Storage(GCS),但在Vertex AI Notebook中加载该模型时,多种方案均出现异常:
尝试1:使用gcsfs加载
代码:
fs = gcsfs.GCSFileSystem() with fs.open(model_path, "rb") as f: model = model.load_model(f) f.close()
报错信息:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) /tmp/ipykernel_542318/3872730142.py in <module> 14 15 with fs.open(model_path, "rb") as f: --> 16 model = model.load_model(f) 17 f.close() 18 /opt/conda/lib/python3.7/site-packages/xgboost/core.py in load_model(self, fname) 2301 length)) 2302 else: --> 2303 raise TypeError('Unknown file type: ', fname) 2304 2305 if self.attr("best_iteration") is not None: TypeError: ('Unknown file type: ', <File-like object GCSFileSystem, bucket/model.bst>)
问题原因:XGBoost的load_model方法不直接兼容gcsfs返回的类文件对象。
尝试2:使用pathlib加载
代码:
from pathlib import Path path_to_model = 'gs://...../model.bst' path = Path(path_to_model) booster_from_file = xgb.Booster(path)
报错信息:
TypeError: 'PosixPath' object does not support item assignment
问题原因:xgb.Booster()的构造参数需要配置字典而非路径,且pathlib无法直接解析GCS格式路径。
尝试3:使用google-cloud-storage下载后加载(返回NoneType)
代码:
from google.cloud import storage storage_client = storage.Client() bucket = 'bucket_name' bucket_obj=storage_client.bucket(bucket) path = '../model/.../md-5-lr-0.05-br-300/model.bst' blob=bucket_obj.blob(path) # Download blob into an in-memory file object model_file = 'model.bst' #BytesIO() blob.download_to_filename(model_file) # Load model from in-memory file object from_file = xgb.Booster() model_name = "model.bst" model = from_file.load_model(model_name) print(type(model)) # NoneType! <class 'NoneType'>
问题原因:load_model是原地修改Booster对象的方法,不会返回新模型,因此接收返回值会得到None。
正确解决方案
方案1:下载到本地后加载(修正尝试3的问题)
from google.cloud import storage import xgboost as xgb # 初始化GCS客户端 storage_client = storage.Client() bucket = storage_client.bucket("bucket_name") blob = bucket.blob("path/to/model.bst") # 下载到本地文件 local_model_path = "model.bst" blob.download_to_filename(local_model_path) # 加载模型 booster = xgb.Booster() # load_model为原地操作,无需接收返回值 booster.load_model(local_model_path) # 验证模型(输出Booster对象信息,而非None) print(booster)
方案2:直接使用GCS路径加载(XGBoost 1.6+支持)
如果你的XGBoost版本≥1.6.0,可直接传入GCS路径加载,无需额外下载:
import xgboost as xgb model_path = "gs://your-bucket/path/to/model.bst" booster = xgb.Booster() booster.load_model(model_path)
注:需确保Notebook环境已安装gcsfs或fsspec,且拥有GCS访问权限。
方案3:使用BytesIO内存加载(无需本地文件)
from google.cloud import storage import xgboost as xgb from io import BytesIO storage_client = storage.Client() bucket = storage_client.bucket("bucket_name") blob = bucket.blob("path/to/model.bst") # 读取模型到内存BytesIO对象 model_bytes = BytesIO() blob.download_to_file(model_bytes) model_bytes.seek(0) # 重置文件指针至开头 # 加载模型 booster = xgb.Booster() booster.load_model(model_bytes)
内容的提问来源于stack exchange,提问作者crbl
相关产品推荐
相关产品推荐

