如何在 tensorflow 服务 (gpu) 中加载自定义动态库 (*.so)?
Posted
技术标签:
【中文标题】如何在 tensorflow 服务 (gpu) 中加载自定义动态库 (*.so)?【英文标题】:How to load customized dynamic libs (*.so) in tensorflow serving (gpu)? 【发布时间】:2021-09-03 20:33:31 【问题描述】:我写了自己的cudaMelloc
,如下所示,我计划将其应用到tensorflow服务(GPU)中,通过LD_PRELOAD
机制跟踪cudaMelloc
调用(可用于限制每个tf服务的GPU使用容器也经过适当修改)。
typedef cudaError_t (*cu_malloc)(void **, size_t);
/* cudaMalloc wrapper function */
cudaError_t cudaMalloc(void **devPtr, size_t size)
//cudaError_t (*cu_malloc)(void **devPtr, size_t size);
cu_malloc real_cu_malloc = NULL;
char *error;
real_cu_malloc = (cu_malloc)dlsym(RTLD_NEXT, "cudaMalloc");
if ((error = dlerror()) != NULL)
fputs(error, stderr);
exit(1);
cudaError_t res = real_cu_malloc(devPtr, size);
printf("cudaMalloc(%d) = %p\n", (int)size, devPtr);
return res;
我使用以下命令将上述代码编译成动态库文件:
nvcc --compiler-options "-DRUNTIME -shared -fpic" --cudart=shared -o libmycudaMalloc.so mycudaMalloc.cu -ldl
当应用于使用命令nvcc -g --cudart=shared -o vector_add_dynamic vector_add.cu
编译的vector_add 程序时,它运行良好:
root@ubuntu:~# LD_PRELOAD=./libmycudaMalloc.so ./vector_add_dynamic
cudaMalloc(800000) = 0x7ffe22ce1580
cudaMalloc(800000) = 0x7ffe22ce1588
cudaMalloc(800000) = 0x7ffe22ce1590
但是当我使用以下命令将其应用于 tensorflow 服务时,cudaMelloc
调用并不引用我编写的动态库。
root@ubuntu:~# LD_PRELOAD=/root/libmycudaMalloc.so ./tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=resnet --model_base_path=/models/resnet
这是我的问题:
是不是因为 tensorflow-serving 是以完全静态的方式构建的,所以 tf-serving 指的是libcudart_static.a
而不是libcudart.so
?
如果是这样,我如何构建 tf-serving 以启用动态链接?
【问题讨论】:
【参考方案1】:是不是因为 tensorflow-serving 是以完全静态的方式构建的,所以 tf-serving 是指 libcudart_static.a 而不是 libcudart.so?
它可能不是完全静态构建的。你可以通过运行来查看是否是:
readelf -d tensorflow_model_server | grep NEEDED
但它可能 与libcudart_static.a
链接。您可以通过以下方式查看是否:
readelf -Ws tensorflow_model_server | grep ' cudaMalloc$'
如果您看到未解析的 (U
) 符号(就像您看到 vector_add_dynamic
二进制文件一样),那么 LD_PRELOAD
应该可以工作。但您可能会看到一个已定义的(T
或 t
)符号。
如果是这样,我如何构建 tf-serving 以启用动态链接?
当然:它是开源的。您所要做的就是弄清楚如何构建它,然后在没有libcudart_static.a
的情况下如何构建它,然后弄清楚当您这样做时会出现什么问题(如果有的话)。
【讨论】:
谢谢你的回复,我打算深入研究一下tf serving的搭建过程以上是关于如何在 tensorflow 服务 (gpu) 中加载自定义动态库 (*.so)?的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 Tensorflow 在使用 Eager Execution 时分配全部 GPU 内存?
如何使用 tensorflow 在 keras 中禁用 GPU?
tensorflow gpu 在“windows”上没有 docker 服务