You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:24:56