【发布时间】: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 以启用动态链接?
【问题讨论】:
标签: tensorflow gpu dynamic-linking tensorflow-serving