ColabにBlackwell世代のG4インスタンスが追加されたので軽く試してみる。
av1エンコードをさせてみる
手持ちのAmpere世代のGPUでは、av1エンコードができないので、av1エンコードができるマシンがあると便利。ということで、適当な画面録画(h.264)をffmpegでav1に変換する。
もともと入っているffmpegではav1エンコードできない
新しくビルドする。ffmpeg処理の前に以下のセルを加えてやる。
%%bash
set -uo pipefail
export DEBIAN_FRONTEND=noninteractive
LOG=/content/ffmpeg_build_full.log
: > "$LOG"
run() {
echo
echo "========== $* ==========" | tee -a "$LOG"
"$@" 2>&1 | tee -a "$LOG"
local status=${PIPESTATUS[0]}
if [ $status -ne 0 ]; then
echo
echo "FAILED: $*" | tee -a "$LOG"
exit $status
fi
}
run apt-get update
run apt-get install -y \
autoconf automake build-essential cmake git \
libass-dev libfreetype6-dev libmp3lame-dev libnuma-dev \
libopus-dev libsdl2-dev libtool libva-dev libvdpau-dev \
libvorbis-dev libvpx-dev libx264-dev libx265-dev \
libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev \
meson nasm ninja-build pkg-config texinfo wget yasm zlib1g-dev
mkdir -p /content/src
cd /content/src
rm -rf nv-codec-headers ffmpeg ffmpeg_build
mkdir -p ffmpeg_build
run git clone --depth 1 https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
run make -C nv-codec-headers -j"$(nproc)"
run make -C nv-codec-headers install
run ldconfig
run git clone --depth 1 --branch n7.0.2 https://github.com/FFmpeg/FFmpeg.git ffmpeg
cd ffmpeg
CUDA_BASE=/usr/local/cuda
if [ ! -d "$CUDA_BASE" ]; then
for d in /usr/local/cuda-*; do
if [ -d "$d" ]; then
CUDA_BASE="$d"
break
fi
done
fi
if [ ! -d "$CUDA_BASE" ]; then
echo "CUDA toolkit directory was not found under /usr/local/cuda*" | tee -a "$LOG"
ls -la /usr/local | tee -a "$LOG"
exit 1
fi
echo "Using CUDA_BASE=$CUDA_BASE" | tee -a "$LOG"
./configure \
--prefix=/content/ffmpeg_build \
--pkg-config-flags="--static" \
--extra-cflags="-I${CUDA_BASE}/include" \
--extra-ldflags="-L${CUDA_BASE}/lib64" \
--extra-libs="-lpthread -lm" \
--bindir=/content/ffmpeg_build/bin \
--enable-gpl \
--enable-nonfree \
--enable-cuda \
--enable-nvenc \
--enable-nvdec \
--enable-libx264 \
--enable-libx265 \
--enable-libvpx \
--enable-libopus \
--enable-libmp3lame \
--enable-libvorbis \
--enable-libass \
--enable-shared \
--disable-static \
2>&1 | tee /content/ffmpeg_configure.log | tee -a "$LOG"
CONFIG_STATUS=${PIPESTATUS[0]}
if [ $CONFIG_STATUS -ne 0 ]; then
echo "FAILED: ./configure" | tee -a "$LOG"
exit $CONFIG_STATUS
fi
run make -j"$(nproc)"
run make install
/content/ffmpeg_build/bin/ffmpeg -version 2>&1 | tee -a "$LOG"
echo
/content/ffmpeg_build/bin/ffmpeg -encoders | grep -E "nvenc|av1" 2>&1 | tee -a "$LOG" || true
容量を1/3くらいまで削減。
設定は、CQが28、presetは2とした。CQが大きいほど画質が荒く、軽量になる。基本CQは24くらい。つまり結構荒めにした。CQ30以上で、小さく文字はスクロールの早い場合で見づらくなることも。presetは数字が小さいほど、処理に時間がかかるが、高効率になる。今回はかなりきつめ。ちなみにpreset3でも、圧縮後のファイルは同じ容量だったから、av1の限界値にちかい?
mac純正の画面録画で、8:45の動画を録画した。変換前のh.264形式の画面録画時点で、サイズは約320MB、av1エンコード後は、約92MBまで削減できた。変換にかかった時間は22秒。
私の所有するmacやiPhoneはav1デコードには対応しているので、今後はav1で保存しておいてもいいかもしれない。気が向いたら、一括変換のスクリプトで変換したい。でもいちいちGdriveに飛ばすのもめんどくさい
av1エンコードのためにこのインスタンスを使うのは勿体無いので、いい使い道を模索しなきゃ。
補遺
同じ動画、同じ設定で、L4(L4インスタンス)では処理時間は32秒だった。
G4は1時間あたりのユニット数はおよそ8.4、L4がおよそ1.7くらいだったので、そもそもエンコーディイング用途には向いていない。(そりゃそうだろと言われるかもしれないが)
コメント