运行 SLURM 环境中的 FFMPEG 多线程

Running FFMPEG multithreads in a SLURM environment

我对从数千个 jpeg 中加速 mp4 文件的编码很感兴趣。我的启动命令如下

singularity exec --bind $work_dir:/mnt $work_dir/container.sif ffmpeg -y -f concat -safe 0 -i <(for f in /mnt/processed_images/$image_folder/image-%06d.jpeg; do echo "file '$f'";done) -vf "crop=trunc(iw/3)*2:trunc(ih/2)*2" -movflags +faststart /mnt/processed_images/summary_files/${image_folder}.mp4

所以我有很多图像,所以我不得不费尽周折才能将它们导入 ffmpeg。我实际上并没有对编码器进行任何调整。我什至不确定我使用的是什么编码器,因为我没有指定(我认为)。我在分布式计算环境中,但我根本不利用它。一项工作大约需要 8 个小时才能完成,这并不理想。理论上我可以使用大量内存和核心,但我不确定如何利用这种能力。

有人有这方面的经验吗?

要在 slurm 机器上使用多核,最简单的方法是使用提交脚本,然后提交作业。如果以下文件名为 submit.sh,则提交命令将为 sbatch submit.sh。该脚本将请求 20 个内核和 50 GB 内存 24 小时。您可能必须在脚本的开头添加一些特定于集群的 slurm 选项。

#!/bin/bash

#SBATCH --time=24:00:00
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=20
#SBATCH --mem=50GB

export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

srun singularity exec --bind $work_dir:/mnt $work_dir/container.sif ffmpeg -y -f concat -safe 0 -i <(for f in /mnt/processed_images/$image_folder/image-%06d.jpeg; do echo "file '$f'";done) -vf "crop=trunc(iw/3)*2:trunc(ih/2)*2" -movflags +faststart /mnt/processed_images/summary_files/${image_folder}.mp4