集成baidu-rpc出现unknow command line flag 'use_gpu'
Created by: fingthinking
本问题是使用C-API,链接libpaddle_capi_whole.a
库,运行的时候遇到UnKnown class type: data尝试解决问题中遇到,主要显示内容如下:
其问题是在使用动态库libpaddle_capi_shared.so
的时候,gflags不识别--use_gpu=False参数。
原使用方式为:
char* argv[] = {(char*)"--use_gpu=False"};
// init paddle
CHECK(paddle_init(1, (char**)argv));
通过将代码改为:
char* argv[] = {(char*)"--use_gpu=False"};
// init paddle
CHECK(paddle_init(0, (char**)argv));
即不传参数了,将该问题解决 但该解决方案属于治标不治本的方法,如果今后有需要使用gpu的需求,仍将面临该问题。
提供一些思路,在使用libpaddle_capi_whole.a的时候,遇到一些编译问题,其中包括gflags与baidu-rpc的兼容性问题,baidu-rpc中使用的gflag的版本是2.0,其中关键不兼容代码:
FlagRegisterer::FlagRegisterer(const char* name, const char* type,
const char* help, const char* filename,
void* current_storage, void* defvalue_storage) {
if (help == NULL)
help = "";
// FlagValue expects the type-name to not include any namespace
// components, so we get rid of those, if any.
if (strchr(type, ':'))
type = strrchr(type, ':') + 1;
FlagValue* current = new FlagValue(current_storage, type, false);
FlagValue* defvalue = new FlagValue(defvalue_storage, type, false);
// Importantly, flag_ will never be deleted, so storage is always good.
CommandLineFlag* flag = new CommandLineFlag(name, help, filename,
current, defvalue);
FlagRegistry::GlobalRegistry()->RegisterFlag(flag); // default registry
}
而在paddle中使用的gflags的版本为2.2.0以上,代码如:
template <typename FlagType>
FlagRegisterer::FlagRegisterer(const char* name,
const char* help,
const char* filename,
FlagType* current_storage,
FlagType* defvalue_storage) {
FlagValue* const current = new FlagValue(current_storage, false);
FlagValue* const defvalue = new FlagValue(defvalue_storage, false);
RegisterCommandLineFlag(name, help, filename, current, defvalue);
}
即2.2版本的gflags与2.0版本存在不兼容问题,该问题通过在2.2版本中增加2.0版本的不兼容代码及相关逻辑,可以解决,但是还是没能够识别出use_gpg参数,这个就不明白为什么了,请paddle帮忙解答疑惑。