在DJL中用GPU运行Whisper Zoo模型遇c10指针错误求助
DJL Whisper模型GPU运行JVM致命错误解决思路
错误原因分析
你遇到的SIGSEGV错误来自DJL的PyTorch底层库,本质是Tensor指针访问异常,通常和张量设备不匹配、内存管理问题或版本兼容性有关。
具体解决步骤
统一张量设备,避免手动局部迁移
不要仅单独迁移处理后的输入张量,要确保所有喂给模型的张量(包括attention mask、辅助状态等)都在同一GPU设备上。可以在自定义Translator的processInput方法末尾,打印所有输出NDArray的设备信息,排查是否有遗漏的CPU张量:System.out.println("Tensor device: " + ndArray.getDevice());更推荐的方式是放弃手动转设备,直接在加载模型时指定GPU,让DJL自动完成模型和输入的设备迁移:
Criteria<AudioData, String> criteria = Criteria.builder() .setTypes(AudioData.class, String.class) .optModelUrls("djl://ai.djl.zoo/whisper") .optDevice(Device.gpu(0)) .build();检查PyTorch与CUDA版本兼容性
DJL的PyTorch引擎版本和系统CUDA版本必须严格匹配:- DJL 0.23.0对应PyTorch 2.0.1,需CUDA 11.7/11.8
- DJL 0.21.1对应PyTorch 1.13.1,需CUDA 11.6
用nvidia-smi或echo $CUDA_VERSION查看系统CUDA版本,调整DJL版本到兼容区间。
排查GPU内存问题
用nvidia-smi实时监控显存占用,若显存不足会导致内存访问异常:- 尝试切换到更小的Whisper模型(如
base.en替代large) - 减小推理的batch size,避免显存溢出
- 尝试切换到更小的Whisper模型(如
规范自定义Translator的张量创建
若必须自定义Translator,直接在GPU设备上创建张量,避免CPU转GPU的内存拷贝问题:NDArray input = manager.create(audioData, Device.gpu(0));
内容的提问来源于stack exchange,提问作者Sreekumar KJ
相关产品推荐
相关产品推荐

