Tensorflow Serving模型指向s3地址,Could not find base path?
时间:2022-07-22
本文章向大家介绍Tensorflow Serving模型指向s3地址,Could not find base path?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
之前有同学遇到一个问题,通过 Workload 配置一个 Serving 服务的时候,通过 model_config_file 这个选项来指定多个模型文件,配置文件大概长这个样子。
➜ tmp cat model.config
model_config_list {
config {
name:'10062'
base_path:'s3://xxx-ai/humanoid/10062'
model_platform:'tensorflow'
}
config {
name:'10075'
base_path:'s3://xxx-ai/humanoid/10075'
model_platform:'tensorflow'
}
}
但是 Serving 服务进程启动的时候,报错了,错误信息是说 Could not find base path xxxxxx,意思是没找到 base path?
其实这里是因为配置文件里的 base path 配置可以发现,最后没有斜杠 /,在 S3 里,没有 / 会被当做是一个对象 object,而 Serving 关于读取 base path 模型的源码如下。从源码可以看到,Serving 会拿到 base path 之后去遍历这个目录下面的文件,而如果是 s3 文件的话,这个对象本身是不存在的,所以就会报错,正确的做法,只要在 base path 参数的最后,补上斜杠 / 即可,如 s3://xxx-ai/humanoid/10075/,而这个问题,当模型在本地文件系统是不存在的。
// Like PollFileSystemForConfig(), but for a single servable.
Status PollFileSystemForServable(
const FileSystemStoragePathSourceConfig::ServableToMonitor& servable,
std::vector<ServableData<StoragePath>>* versions) {
// First, determine whether the base path exists. This check guarantees that
// we don't emit an empty aspired-versions list for a non-existent (or
// transiently unavailable) base-path. (On some platforms, GetChildren()
// returns an empty list instead of erring if the base path isn't found.)
if (!Env::Default()->FileExists(servable.base_path()).ok()) {
return errors::InvalidArgument("Could not find base path ",
servable.base_path(), " for servable ",
servable.servable_name());
}
// Retrieve a list of base-path children from the file system.
std::vector<string> children;
TF_RETURN_IF_ERROR(
Env::Default()->GetChildren(servable.base_path(), &children));
// GetChildren() returns all descendants instead for cloud storage like GCS.
// In such case we should filter out all non-direct descendants.
std::set<string> real_children;
for (int i = 0; i < children.size(); ++i) {
const string& child = children[i];
real_children.insert(child.substr(0, child.find_first_of('/')));
}
children.clear();
children.insert(children.begin(), real_children.begin(), real_children.end());
const std::map<int64 /* version */, string /* child */> children_by_version =
IndexChildrenByVersion(children);
bool at_least_one_version_found = false;
switch (servable.servable_version_policy().policy_choice_case()) {
case FileSystemStoragePathSourceConfig::ServableVersionPolicy::
POLICY_CHOICE_NOT_SET:
TF_FALLTHROUGH_INTENDED; // Default policy is kLatest.
case FileSystemStoragePathSourceConfig::ServableVersionPolicy::kLatest:
at_least_one_version_found =
AspireLatestVersions(servable, children_by_version, versions);
break;
case FileSystemStoragePathSourceConfig::ServableVersionPolicy::kAll:
at_least_one_version_found =
AspireAllVersions(servable, children, versions);
break;
case FileSystemStoragePathSourceConfig::ServableVersionPolicy::kSpecific: {
at_least_one_version_found =
AspireSpecificVersions(servable, children_by_version, versions);
break;
}
default:
return errors::Internal("Unhandled servable version_policy: ",
servable.servable_version_policy().DebugString());
}
if (!at_least_one_version_found) {
LOG(WARNING) << "No versions of servable " << servable.servable_name()
<< " found under base path " << servable.base_path();
}
return Status::OK();
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android BottomSheetDialog使用实现底部拖动弹窗
- Android 滑动渐变背景Toolbar、点击置顶ScrollView
- Android 自定义View 画圆(奥运五环)
- Android 触摸屏交互之手势监听
- Android Glide加载网络图片不显示,但用网页打开又正常显示
- Android获取APP的版本号和版本名
- Android 在一个APP里打开另一个APP
- Android 自定义加载动画Dialog弹窗
- Android 天气APP(十一)未来七天的天气预报、逐小时预报、UI优化
- Android 天气APP(十)继续优化、下拉刷新页面天气数据
- Activity 活动跳转(Java&Kotlin)
- Android 天气APP(九)细节优化、必应每日一图
- Android CheckBox修改选中颜色并去除选中时的水波纹效果
- 绘制带回归线的散点图
- Java&Android像素px、dip转换工具类