首页 > 编程问答 >python joblib.load 发生错误:协议 0 中的持久 ID 必须是 ASCII 字符串 在 GCP 云运行中

python joblib.load 发生错误:协议 0 中的持久 ID 必须是 ASCII 字符串 在 GCP 云运行中

时间:2024-08-08 03:56:53浏览次数:12  
标签:python google-cloud-platform google-cloud-storage google-cloud-run joblib

总体而言: 我尝试使用 Cloudbuild 和 Cloudrun 构建 BERT 模型。我将模型(参数)和元数据(标签)保存在 GCP Cloud Storage 中。但是,我遇到了通过 joblib.load() 加载metadata.bin 文件的错误。 我的metadata.bin 文件包含UTF-8 字符,但joblib.load 需要ASCII 字符。在我的版本中默认协议是4,但错误消息表明协议是0。

相关依赖项: python 3.8.0,joblib 1.1.1(我已经尝试升级最新版本),google -api-core==2.19.1,google-auth==2.32.0,google-cloud-core==2.4.1,google-cloud-storage==2.18.0

我的努力: 我已经尝试过两种情况。

  1. 尝试过 本地 在这种情况下, 在 GCP Cloud Storage 下载 model.bin 和metadata.bin 文件都有效
  2. 尝试过 docker 在这种情况下, 在docker化容器中加载metadata.bin文件和model.bin文件也可以

错误详细信息
`

  File "./src_review/model_server.py", line 70, in load_bert_model
      metadata = joblib.load(metadata_path)
  File "/usr/local/lib/python3.8/site-packages/joblib/numpy_pickle.py", line 658, in load
      obj = _unpickle(fobj, filename, mmap_mode)
  File "/usr/local/lib/python3.8/site-packages/joblib/numpy_pickle.py", line 577, in _unpickle
      obj = unpickler.load()
  File "/usr/local/lib/python3.8/pickle.py", line 1210, in load
      dispatch[key[0]](self)
  File "/usr/local/lib/python3.8/pickle.py", line 1244, in load_persid
      raise UnpicklingError(
          _pickle.UnpicklingError: persistent IDs in protocol 0 must be ASCII strings`

我的代码: `| ||来自 GCP 官方文档

 def load_bert_model(config: argparse.Namespace):
      bucket = storage_client.bucket(bucket_name)
      model_blob = bucket.blob(model_file)
      metadata_blob = bucket.blob(metadata_file)        

      local_model_path = '/tmp/pytorch_model.bin'
      metadata_path = '/tmp/meta.bin'    

      print(f"Downloading model to {local_model_path}")

      model_blob.download_to_filename(local_model_path)        
      log.info(f"Model downloaded to {local_model_path}")
      metadata_blob.download_to_filename(metadata_path)
      log.info(f"Metadata (label) downloaded to {metadata_path}")

      metadata = joblib.load(metadata_path)
    ...`

`||`

预期原因:

def upload_directory_with_transfer_manager(bucket_name, source_directory, workers=1):
    bucket = create_bucket_if_not_exists(bucket_name)
    directory_as_path_obj = Path(source_directory)
    paths = directory_as_path_obj.rglob("*.bin")

    file_paths = [path for path in paths if path.is_file()]

    relative_paths = [path.relative_to(source_directory) for path in file_paths]

    string_paths = [str(path) for path in relative_paths]

    print("Found {} files.".format(len(string_paths)))

    results = transfer_manager.upload_many_from_filenames(
        bucket, string_paths, source_directory=source_directory, max_workers=workers, skip_if_exists=False
    )

    for name, result in zip(string_paths, results):
        if isinstance(result, Exception):
            print("Failed to upload {} due to exception: {}".format(name, result))
        else:
            print("Uploaded {} to {}.".format(name, bucket.name))

我认为云运行配置与我的测试环境有很大不同。但我没想到主要原因。

感谢您的努力! I think cloud run config is quite different from my test environments. But I could not expected the main causes.

Thanks for your efforts!


遇到的错误“协议 0 中的持久 ID 必须是 ASCII 字符串”表明正尝试使用旧版本的 pickle 协议加载使用较新版本的 pickle 协议保存的 joblib 文件。这可能发生在在本地环境中使用更高版本的 Python 或 joblib 创建文件时。

尽管已将 joblib 升级到最新版本,但存储在 Cloud Storage 中的文件可能仍然使用旧版本的协议进行序列化。

可以尝试以下解决方案:

1. 重新保存 metadata.bin 文件:

  • 确保在本地环境中使用与 Cloud Run 环境相同的 Python 和 joblib 版本。
  • 使用 joblib.dump() 函数重新保存 metadata.bin 文件。这将使用当前环境的 pickle 协议对文件进行序列化。
  • 将更新后的 metadata.bin 文件上传到 Cloud Storage。

2. 指定 pickle 协议版本:

  • 在加载 metadata.bin 文件时,使用 joblib.load() 函数的 protocol 参数指定 pickle 协议版本。尝试使用较低的协议版本,例如:
metadata = joblib.load(metadata_path, protocol=2)
  • 可以尝试不同的协议版本,直到找到能够成功加载文件的版本。

3. 确保编码一致性:

  • 在保存和加载 metadata.bin 文件时,请确保使用的编码一致。可以尝试在 joblib.dump() joblib.load() 函数中指定 encoding='utf-8' 参数。

4. 检查 Cloud Run 环境:

  • 仔细检查的 Cloud Run 环境的 Python 和 joblib 版本。确保它们与在本地环境中使用的版本兼容。

其他建议:

  • 为了便于调试,可以尝试在 Cloud Run 实例中打印 joblib pickle 的版本信息:
import joblib
import pickle

print(f"Joblib version: {joblib.__version__}")
print(f"Pickle version: {pickle.format_version}")
  • 如果仍然遇到问题,请考虑在 Cloud Storage 中创建新的存储桶,并将所有文件(包括 model.bin metadata.bin )上传到该存储桶。这将有助于排除与现有文件相关的任何潜在问题。

通过遵循这些步骤,应该能够解决 joblib.load() 错误并成功加载 metadata.bin 文件。

标签:python,google-cloud-platform,google-cloud-storage,google-cloud-run,joblib
From: 78845404

相关文章

  • Python + Svelte,如何使用本地文件系统
    总结一下,我有一个用python编写的应用程序。它在输入时需要一堆视频文件。使用一些魔法并生成合并的视频文件输出。我没有找到一个好的GUI解决方案(tkinter,QT,TUI等),所以我选择Svelte框架。但是出现了一个问题,我如何使用本地文件系统。在GUI(svelte)上,我必须上......
  • 如何在Python中绘制伪球面
    目标是使用meshgrid和numpy库生成伪球体的三维图形,但我使用下面的代码生成的图形不完整u=np.linspace(0,np.pi,50)v=np.linspace(0,2*np.pi,100)x,y=np.meshgrid(u,v)X=np.arccos(x)*np.cos(y)Y=np.arccos(x)*np.sin(y)Z=x-np.tan(x)fig=plt.f......
  • 18:Python集合属性
    #Python3集合#集合(set)是一个无序的不重复元素序列。#集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。#集合中元素必须是不可变类型,也就说里面不能是列表和字典#可以使用大括号{}创建集合,元素之间用逗号,分隔,或者也可以使用set()函数创建集合。s......
  • Python爬虫案例与实战:爬取源代码练习评测结果
    Python爬虫案例与实战:爬取源代码练习评测结果本章案例将介绍用Python编写程序实现简单网站的模拟登录,然后保持登录后的网页会话,并在会话中模拟网页表单提交,之后使用Requests库的高级特性爬取提交之后的返回结果。在HTTP网页中,如登录、提交和上传等操作一般通过向网页发送......
  • Python爬虫案例与实战:爬取豆瓣电影简介
    Python爬虫案例与实战:爬取豆瓣电影简介本章案例将介绍如何爬取豆瓣电影简介,以此帮助读者学习如何通过编写爬虫程序来批量地从互联网中获取信息。本案例中将借助两个第三方库----Requests库和BeautifulSoup库。通过Requests库获取相关的网页信息,通过BeautifulSoup库解析大......
  • 趣味Python游戏编程:第3章 递归函数的威力:扫雷
    趣味Python游戏编程:第3章递归函数的威力:扫雷在第2章中,我们制作了一个拼图游戏,玩家通过鼠标操作图片块移动。本章设计一款扫雷游戏,玩法是在一个方块阵列中随机埋设一定数量的地雷,然后由玩家逐个打开方块,并以排除所有地雷为最终游戏目标。如果玩家打开的方块中有地雷,则游戏......
  • Python 依赖管理神器 Poetry 深入指南
    Poetry依赖管理详细教程引言在现代软件开发中,依赖管理是项目成功的关键。Python开发者现在有了一个新的选择:Poetry。Poetry是一个现代的Python包管理工具,旨在简化Python项目的创建、打包和发布。它提供了一种更直观和高效的方式来管理项目的依赖关系,相较于传统的p......
  • python的函数、魔法方法和案例
    1.python函数中self的用法在Python中,self 是一个对当前实例(对象)的引用,用于访问属于该类的变量和方法。在定义类的方法时,通常需要将 self 作为第一个参数。这允许在类的实例上调用方法时,自动将实例本身作为参数传递给方法。classPerson:def__init__(self,name......
  • 【视频讲解】Python灰色关联度分析直播带货效用、神经退行性疾病数据
    原文链接:https://tecdat.cn/?p=37273原文出处:拓端数据部落公众号 分析师:JiayiDeng 本文展示如何用灰色关联度分析的直播带货效用及作用机制研究,并结合一个分析神经退行性疾病数据实例的代码数据,为读者提供一套完整的实践数据分析流程。一、研究难点直播带货作为新兴产业,缺......
  • 线性方程组迭代算法的Python实现
    更多精彩,关注博客园主页,不断学习!不断进步!我的主页csdn很少看私信,有事请b站私信博客园主页-发文字笔记-常用有限元鹰的主页内容:ABAQUS数值模拟相关Python科学计算开源框架,编程学习笔记哔哩哔哩主页-发视频-常用FE-有限元鹰的个人空间内容:模拟案例网格划分游戏视频,......