通过Dataflow从GCS桶读取Tensorflow文件时:SSL无替代证书主题名称匹配目标主机名

0 投票
1 回答
639 浏览
提问于 2025-05-18 21:18

我正在运行一个稍微修改过的cloudml花卉示例,目的是用来分类我自己的图片,但在预处理部分遇到了问题。看起来当我指向我在另一个项目中的图片时,它们无法被访问:

返回pywrap_tensorflow.ReadFromStream(self._read_buf, length, status): 文件 "/usr/lib/python2.7/contextlib.py",第24行,在exit self.gen.next() 文件 "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/errors_impl.py",第466行,在raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode(status)) UnavailableError: 执行HTTP请求时出错(HTTP响应代码0,错误代码51,错误信息'SSL:没有替代证书主题名称与目标主机名'$BUCKET.com.storage.googleapis.com'匹配')在读取$BUCKET.com/image.jpg时

(我把实际的桶名称替换成了$BUCKET)。

我是在一个虚拟机上运行这些脚本,并且已经从requirements.txt文件中安装了所需的包:

apache-beam[gcp]==0.6.0

pillow==4.0.0

tensorflow==1.4.1

到目前为止,我尝试/做了以下事情:

  • 确认我可以在没有修改的情况下运行原始的花卉预处理,来自sample.sh文件
  • 将默认项目的计算引擎服务账户("default-project-id"-compute@developer.gserviceaccount.com)的访问权限更改为“存储对象查看器”,以便访问持有桶的项目。对于相应的@cloudservices.gserviceaccount.com也做了同样的操作
  • 确认指向另一个项目中桶内图片的路径名称是正确的
  • 当从一个没有 .com 名称的桶读取时,但仍在另一个项目中(并且该项目的计算引擎服务账户的访问权限也设置为“存储对象查看器”)时,抛出了类似的错误,只是现在是“PermissionDenied”而不是“Unavailable”。

  • 使用我的默认gcloud认证,我能够在本地运行预处理,没有错误。

    python trainer/preprocess.py \ --input_dict "$DICT_FILE" \ --input_path $INPUT_PATH_EVAL \ --output_path $OUTPUT_PATH_EVAL \

  • 我查看了这里的解决方案,但那是一个旧版本的tensorflow,应该不会在1.4版本上出现问题,如果真是这样,我可能仍然能够访问常规的非域桶,但我现在无法访问。

那么,在运行这个示例时,我在项目之间的访问上缺少了什么呢?

相关问题:

  • 暂无相关问题
暂无标签

1 个回答

2

谷歌的TensorFlow API不支持双通配符格式,比如 *.*.storage.googleapis.com。它们只支持一种通配符证书,比如 *.storage.googleapis.com。在你的情况中,当你使用 "$BUCKET.com.storage.googleapis.com”时,证书中出现了多于一个相同类型的身份(例如,多个DNS名称)。想了解更多细节,可以参考这个RFC标准

出现“权限被拒绝”的错误是因为权限问题。所以在这种情况下,你没有足够的权限去访问其他项目的存储桶,但服务是可以使用的。想获取更多信息,可以查看请求端点访问控制选项的文档。

最简单的解决办法是通过谷歌云API将你的文件复制到谷歌存储中,然后从那里获取图片。

撰写回答