雑記

Google colab でRTX Pro 6000 が使えるようになった

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くらいだったので、そもそもエンコーディイング用途には向いていない。(そりゃそうだろと言われるかもしれないが)

コメント