Python 学习整理3 202608

用子进程隔离 large-v3:原理:子进程结束 → OS 回收该进程占用的所有显存(包括 CTranslate2 的 cudaMalloc)→ 主进程完全不受影响。

PHPer 2026-08-29 2 0 0

用子进程隔离 large-v3:原理:子进程结束 → OS 回收该进程占用的所有显存(包括 CTranslate2 的 cudaMalloc)→ 主进程完全不受影响。

实际上v3是有贡献的,只是跑100条测不出来,我跑1000多条里,能看到和v2的贡献差不多。

对,你说得没错。代码确实没把 v3 的显存彻底释放干净,所以才 OOM。

问题根源我之前说了:del + torch.cuda.empty_cache() 只能清 PyTorch 侧的缓存,CTranslate2 用 cudaMalloc 分配的显存不受控制。

但既然你确认了代码层面释放不干净,那就不是"加几行 gc.collect() 就能解决"的事。这是 CTranslate2 的已知行为——它的 CUDA 上下文在进程生命周期内不会真正归还显存给驱动。

真正能解决问题的做法

用子进程隔离 large-v3:

import multiprocessing as mp

def _run_large_v3(audio_file, model_dir, compute_type, result_queue):
    """在子进程里跑 large-v3,进程退出时 OS 回收所有显存"""
    try:
        model = WhisperModel(
            f"{model_dir}\\faster-whisper-large-v3",
            device="cuda",
            compute_type=compute_type
        )
        asr_text = transcribe(model, audio_file)
        result_queue.put((True, asr_text))
    except Exception as e:
        result_queue.put((False, str(e)))

# 主进程里调用
if model_name == "faster-whisper-large-v3" and lazy_load_large:
    result_queue = mp.Queue()
    p = mp.Process(
        target=_run_large_v3,
        args=(audio_file, args.model_dir, args.compute_type, result_queue)
    )
    p.start()
    p.join(timeout=120)  # 2分钟超时
    
    if p.is_alive():
        p.kill()
        print(f" [{model_name:25s}] 超时,跳过")
        all_results.append(f"{model_name}:TIMEOUT")
        continue
    
    success, result = result_queue.get()
    if success:
        asr_text = result
        asr_time = 0  # 子进程内计时你可以用 Queue 多传一个值
        print(f" [{model_name:25s}] 子进程完成")
    else:
        print(f" [{model_name:25s}] 失败: {result}")
        all_results.append(f"{model_name}:ASR_ERROR")
        asr_error_results.append(f"sub_id:{sub_id} [{model_name}] {result}")
        continue

原理:子进程结束 → OS 回收该进程占用的所有显存(包括 CTranslate2 的 cudaMalloc)→ 主进程完全不受影响。这是唯一能保证"彻底释放"的方式。...

立即注册
更新于:2026-08-29 05:39:22
    您需要登录后才可以评论。 立即注册
    相关内容

    CentOS 8 结束生命周期,切换到 CentOS-Vault 源教程(vault源不好用,...

    Centos7 安装Apache过程详解

    PHP strpos() 对比 mysql locate()

    CasaOS one-click installation scripts

    composer的安装和使用知识整理

    慎用composer update

    Could not open input file: composer.phar报错

    composer在国内使用效果很差,总提示没有找到要下载的文件

    compser安装后无法使用,php7.4版本下安装的

    win10系统 安装好composer后 cmd 命令行下输入composer提示不是内部或外部的命...

    使用composer安装项目需要注意的

    Windows环境下Composer的安装教程遇到的问题及解决方法

    = 8.0.0".">解决Yii2里引入自定义文件 composer dump-autoload后报错:Composer detect...

    composer 设置Github全局 token,在所有项目上都使用阿里云镜像

    Packagist.org 明确了 Composer 1.x 被弃用的时间表

    composer.json 变更autoload files后要怎么操作

    composer 在国内现在在是太难用了 20231120

    Call to undefined function Composer\XdebugHandler\putenv() in phar 运...

    composer update 由于目标计算 机积极拒绝,无法连接。

    解决composer update出现的Discard changes [y,n,v,d,s,?]的问题

    推荐内容

    真枪实弹,假戏真做,12部具有“实干精神”的电影!

    怎样使用V2Ray代理和SSTap玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩...

    sstap游戏代理教程 从此玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩虹六...

    BT磁力搜索网站汇总和找不到的资源

    什么是磁力链接,您如何使用?

    Z-Library:全球最大的数字图书馆/含打不开的解决方案/镜像

    使用V2Ray的mKCP协议加速游戏

    v2rayN已停止工作