问题描述
cryosparc运行报错:File "/home/software/cryoSparc/cryosparc_worker/deps/anaconda/envs/cryosparc_worker_env/lib/python3.10/site-packages/numba/cuda/cudadrv/driver.py", line 408, in _check_cuda_python_error raise CudaAPIError(retcode, msg) numba.cuda.cudadrv.driver.CudaAPIError: [CUresult.CUDA_ERROR_INVALID_VALUE] Call to cuMemHostAlloc results in CUDA_ERROR_INVALID_VALUE
报错解释:程序在运行中,调用服务器的内存时报错,无法分配内存(不是显存,也不是硬盘)
可能原因1:实际物理内存不足,一般可能会出现在Non-uniform refinement等需要过多占用内存的任务中
解决方案:加内存条;减少参数设置(如CTF相关参数,单独使用任务计算),降低计算所需内存量
可能原因2:cuda或nvidia驱动版本不匹配cryosparc需求
检查cuda版本 nvcc -V
:官方推荐 cuda 11.8
检查驱动版本 nvidia-smi
:Nvidia Driver 520.61.05 or newer
可能原因3:物理内存空间足够,但就是无法分配
查询内存的使用情况 watch -n 3 free -h
:输出
total used free shared buff/cache available
Mem: 251Gi 105Gi 4.3Gi 20Mi 141Gi 144Gi
Swap: 39Gi 9.0Mi 39Gi
缓存区(buff/cache)的占用 无法释放或程序无法使用,一般缓存区是动态的,根据程序需要再分配的
但是我这里的情况是缓存区的空间只增不减,尝试手动释放所有缓存:
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches && free -h
可以正常运行,但只是暂时的,如此确定了是这个原因
最终解决方案:
禁用 Page-Locked 内存分配
在 CryoSPARC Worker 的配置文件(cryosparc_worker/config.sh
)中加入下面这一行:
export CRYOSPARC_NO_PAGELOCK=true
重启cryosparc服务
cryosparcm restart
可能原因4:linux系统内核太老的问题
There are various unresolved incompatibilities and instabilities when using CUDA applications on older Linux kernels (e.g., 3.10 found in CentOS 7). Several users have reported sporadic occurrences of cufftInvalidPlan and cuMemHostAlloc Failed errors while using CentOS 7.
内核查看命令 uname -r