記事の目次

    みなさんこんにちは。先日、Walt Disney Animation Studiosが映画『モアナと伝説の海』で使用したデータを公開しました。弊社のように直接映像制作を行わず、開発を行なっているようなところではテスト用の素材を用意するのが意外と大変なので、このような大規模プロダクションで使用されたデータが公開されるのはとても助かります。折角貴重なデータを入手することもできたわけですし、是非とも自力でレンダリングできるようにしたいところです。皆さんも早速ダウンロードしてシーン構築とレンダリングを試されているのではないでしょうか。この記事が公開されるときにはデータの公開から三週間ほど経っているので、多くの方がご自分の手元でレンダリングすることに成功していることでしょう:-)

    TEXT_痴山紘史 / Hiroshi Chiyama(日本CGサービス
    EDIT_尾形美幸 / Miyuki Ogata(CGWORLD)

    前述のデータを肴に本連載でも記事を書いてみたいところなのですが、データを使用する目的が研究・開発用途に限られているため、その内容を元に記事にしてしまうのはちょっと微妙かなぁと思っています。研究・開発をした結果のレポートと言えば言えなくもないんですけどね。このあたりの線引きは迷うことが多いです。

    余談ですが、CG系の論文で良く使われるウサギ(Stanford Bunny)や龍(Dragon)、それから両腕を上げた小太りなおじいさん(Happy Buddha)などのモデルデータにも使用の際の注意事項が明記されています。こういう文章は本来きちんと読むべきで、読んでみると結構興味深いことが書いてあります。そして一度読むと、あー、読まないで使っている人結構いるな~というのがわかったりします。笑。

    環境構築の続き

    前回に引き続き、環境構築のお話を進めていきます。

    まず初めにお詫びしておかなければいけないことがあります。前回の予告として今回はCY2016環境の構築を行いますとお伝えしていたのですが、ちょっとそれ以前に対応しておかなければいけないことが多かったので、今回はCY2016に一部対応しつつPixar Animation Studios(以下、Pixar)のUSDを使用できる環境構築を行なっていきます。期待していただいた方はすみません。そして、今回も駆け足での説明になります。詳細な説明は省いているものの、一通りの手順は解説していますし自分で環境構築をする際のハマり所は押さえているので、この記事を参考に自分で調べながらチャレンジしてみてください。

    今回構築する環境

    今回はDockerコンテナ内でGPU(GeForce GTX 1080)を使用できるようにし、usdviewを動かすところまで行います。そのためには以下の手順を踏む必要があります。

    • ・NVIDIAドライバのインスト―ル
    • ・nvidia-dockerのインストール
    • ・Dockerコンテナ内にUSD環境構築

    Dockerを使わずに実機上で直接動く環境をつくるだけであればそれほど難しいことはなく、ほぼマニュアル通りに操作をしていくだけで環境をつくることができるはずです。個人で使用するのであればそれでもいいですが、数十人数百人という規模のプロダクションでそのような管理をしていては、現場の細かい要求に対応しきれません。そのため、本記事ではこのような構成にしています。

    また、記事を書く際の環境も更新しています。前回までは仮想マシン上で動いているCentOS7上でDockerを動かして環境を構築していたのですが、今回からはGPUを使用するため実機を用意しました。そこで、弊社の技術の粋を集めた世界標準マシンを本連載で初お披露目します!!


    はい剥き出しです。どのご家庭にもある余ったPCパーツを寄せ集めてつくりました。技術検証目的のPCって大体こんな感じですよね :-)

    スペックとしては以下のような感じです。GPUは最新のものですが、それ以外は数年前のパーツ構成です。

    CPU:Core i7-3770
    Mem:32GB
    SSD:SanDisk SDSSDHII 960GB
    GPU:GeForce GTX1080

    このマシンに環境構築をしていきます。


    ・環境構築

    まずはCentOSのアップデートをし、デスクトップ環境をインストールします。

    $ sudo yum -y update
    $ sudo yum -y groupinstall "GNOME Desktop"
    $ sudo reboot
    

    ・NVIDIAドライバのインストール

    NVIDIAドライバをインスト―ルします。この時注意点として、OSがUEFIを使用して起動するように設定されている場合、デフォルトではドライバのインストールの際に署名が必要になるようです。本来ならこれもきちんと行うべきなのでしょうが、ちょっとめんどくさそうなのでUEFI設定メニューからSecure Bootをオフにして署名が必要ないようにしておきます。

    ドライバはNVIDIAのWebサイトからダウンロードしてください。今回は390.67を使用しました。

    $ wget http://jp.download.nvidia.com/XFree86/Linux-x86_64/390.67/NVIDIA-Linux-x86_64-390.67.run
    $ chmod +x NVIDIA-Linux-x86_64-390.67.run
    

    CentOS7では標準でnouveauというドライバが使用されています。NVIDIA純正ドライバを使用するためにはこれを無効にする必要があります。ちょっと前はドライバの無効化は自分で行う必要があったため、検索して出てくる記事でもそのようにしているところがたくさんあります。今ではかなり自動化されているため、インストーラを実行するだけで自動的に行なってくれます。

    まずはドライバをビルドするために必要なパッケージをインストールします。

    $ sudo yum -y install kernel-devel kernel-headers gcc make git pciutils tmux
    

    ドライバをインストールする際にはXを落としておく必要があります。この際、nouveauを無効にするために一度再起動してからドライバのインストールをする必要があるので、システムの設定としてオフにしておきます。

    $ sudo systemctl set-default multi-user.target
    

    一度目のNVIDIA-Linux-x86_64-390.67.runの実行でnouveauを無効化します。

    $ sudo ./NVIDIA-Linux-x86_64-390.67.run
    $ reboot
    

    再起動後、nouveauが無効になっていることを確認します。

    $ lsmod | grep nouveau
    

    何も表示されなければ成功です。続いてドライバのインストールをします。最近のインストーラは本当に親切で、メニューに従っていくだけで完了します。

    $ sudo ./NVIDIA-Linux-x86_64-390.67.run
    

    ドライバのインストールができたらXが起動するようにしておきます。

    $ sudo systemctl set-default graphical.target
    $ reboot
    

    きちんと認識されているか確認します。

    $ lspci | grep -i nvidia
    01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1080] (rev a1)
    01:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
    $ lsmod | grep vidia
    nvidia_uvm            760845  2
    nvidia_drm             39676  1
    nvidia_modeset       1104417  6 nvidia_drm
    nvidia              14364138  397 nvidia_modeset,nvidia_uvm
    drm_kms_helper        177166  1 nvidia_drm
    drm                   397988  4 drm_kms_helper,nvidia_drm
    ipmi_msghandler        46608  2 ipmi_devintf,nvidia
    i2c_core               63151  4 drm,i2c_i801,drm_kms_helper,nvidia
    

    ※このスクリーンショットはWebブラウザ上で表示が崩れないようにするために後日取得しました。


    ・Animal Logicのdocker-usdを使ってUSD環境を構築する

    Google様やGitHub様にお伺いを立てたところ、Animal Logicが公開しているUSD環境構築システムをベースに作業をするのが良さそうです。

    こちらはUSD環境をつくるためのものなのでCY2016にほぼ準拠、ただしPySide2は未対応ということです。ただし、前回ご紹介したptigas/vfxplatformとちがって環境構築用のコードも全てあるのでCY2016にきちんと準拠する場合でもこれをベースにするのが良いでしょう。ちなみに、今回はやりませんがdocker-usdにはUSD対応maya2016やmaya2017環境を構築するためのスクリプトも含まれています。本当、Animal Logic様様です。

    ※docker-usdは環境構築の手順がかなりシビアなようで、途中まで実行して失敗した場合に二度目以降はそのままでは正常に実行できないなど問題も多々あります。この辺りは各自必要に応じてDockerfileや環境構築用スクリプトの中身を確認しながら対応していくことになります。ここで何か問題があるからと言ってAnimal Logicに文句を言うのは筋違いです。オープンソースソフトウェアというのは、問題があったら自分の力で対応していくのが正しい関わり方です :-)


    ・Dockerのインストール

    こちらは前回と同じです。

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum makecache fast
    sudo yum install -y docker-ce
    sudo systemctl start docker
    sudo systemctl enable docker
    

    ・nvidia-dockerのインストール

    Dockerコンテナ内のプログラムからGPUを使用するためにnvidia-dockerを使用します。ここで注意事項があります。nvidia-dockerにはnvidia-docker1とnvidia-docker2があります。記事執筆時点ではnvidia-docker2はOpenGL対応をするのが一手間かかるようです。そこで、今回はnvidia-docker1を使います。

    $ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker-1.0.1-1.x86_64.rpm
    $ sudo rpm -i /tmp/nvidia-docker-1.0.1-1.x86_64.rpm
    $ sudo systemctl start nvidia-docker
    $ sudo systemctl enable nvidia-docker
    

    以上でnvidi-dockerのインストールができたので、Dockerコンテナ内でGPUが認識されているか確認します。

    ※このスクリーンショットはWebブラウザ上で表示が崩れないようにするために後日取得しました。


    nvidia-smiでGPUが認識されています。


    ・docker-usdのインストール

    $ sudo yum -y install git
    $ git clone https://github.com/AnimalLogic/docker-usd.git
    $ cd docker-usd/
    $ cd linux/
    $ mkdir ../apps
    

    そのままでは以下のようなエラーになるので、build-centos7.shを書き換えます。

    Copy local root certificates for corporate networks
    cp: cannot stat '/etc/pki/ca-trust/source/anchors/*': No such file or directory
    
    $ vi build-centos7.sh
    # コメントアウト
    # [ -e /etc/pki/ca-trust/source/anchors ] && cp -u /etc/pki/ca-trust/source/anchors/* cert/
    

    また、SourceForgeからファイルを取得しようとすると証明書関連のエラーが出たので、--no-check-certificateオプションをつけてこれを回避します。

    ※これも本当はもっときちんとした対応をしないといけないはずなんですが。

    $ vi scripts/download_vfx.sh
    
        if [[ -z "${HTTP_HOSTNAME}" ]]; then
          # wget $wgetPath -P "$DOWNLOADS_DIR" -O "$DOWNLOADS_DIR/$filepath" -nc
          wget $wgetPath -P "$DOWNLOADS_DIR" -O "$DOWNLOADS_DIR/$filepath" -nc --no-check-certificate
          if [[ $? -ne 0 ]]; then
    

    次ページ:
    USDのバージョン指定

    [[SplitPage]]

    USDのバージョン指定

    現在(2018年7月10日時点)の最新リリース版はv0.8.5です。

    ※USD_VERSIONを指定してもDockerfile内で0.8.1という値がハードコーディングされてしまっているので、作成されるコンテナの名前は0.8.1になってしまいます。全部書き換えてもいいのですが、今回は面倒なのでそのままにしておきます。

    $ vi centos7/usd/Dockerfile
    
    # 0.8.5 に書き換え
    ENV USD_VERSION "0.8.5"
    

    インストール

    $ sudo ./build-centos7.sh ../apps/
    

    数十分から数時間ほど待つと処理が終わります。私の環境では40分くらいで終わりました。

    さて、ビルドは無事に成功したでしょうか?

    $ sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    usd-docker/usd      0.8.1-centos7       14dd3f8fefa4        6 minutes ago       3.63GB
    usd-docker/usd      latest-centos7      14dd3f8fefa4        6 minutes ago       3.63GB
    usd-docker/vfx      1-centos7           0f98602ca6a6        27 minutes ago      2.76GB
    usd-docker/vfx      latest-centos7      0f98602ca6a6        27 minutes ago      2.76GB
                                374b1682290a        About an hour ago   2.28GB
    usd-docker/base     1-centos7           3f8667ce0f30        About an hour ago   2.28GB
    usd-docker/base     latest-centos7      3f8667ce0f30        About an hour ago   2.28GB
                                baea292c0265        About an hour ago   2.18GB
    nvidia/cuda         7.5-devel-centos7   1c32c124906d        4 days ago          1.24GB
    
    $ sudo nvidia-docker run --rm --env=DISPLAY=$DISPLAY --env="QT_X11_NO_MITSHM=1" --env="LIBGL_ALWAYS_INDIRECT=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --volume="/home:/home:rw" -ti usd-docker/usd:latest-centos7 /opt/usd/usd/0.8.5/bin/usdview /opt/usd/usd/0.8.5/share/usd/tutorials/convertingLayerFormats/Sphere.usd
    

    見事にusdviewが起動しました!!


    ・サンプルデータの入手

    PixarのWebサイトにサンプルデータがあります。こちらのKITCHEN SETを開いてみます。

    $ sudo nvidia-docker run --rm --env=DISPLAY=$DISPLAY --env="QT_X11_NO_MITSHM=1" --env="LIBGL_ALWAYS_INDIRECT=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --volume="/home:/home:rw" -ti usd-docker/usd:latest-centos7 /opt/usd/usd/0.8.5/bin/usdview ~/Downloads/Kitchen_set.usd
    


    ちなみに起動時の表示は最も軽いモードで行われています。View→Complexityでサブディビジョンの詳細さを変えることができます。

    Complexity: Low
    


    Complexity: High
    


    今回までで、ものすごく駆け足ではあるもののUSDを使用する環境の構築まで行うことができました。えっえっ!? Pixar!? そこが使っている環境!? と聞くとものすごいことのように感じて尻込みしてしまうかもしれませんが、それほど高度なことをしなくても同様な環境を手元につくることができるのは本当にいい時代だなぁ~と思います。だからこそこの環境を生かせるところと生かせないところでどんどん格差が広がってしまうと言うことができます。

    今後の課題

    これで、Docker内で動いているGPUを使用するアプリケーションをLinuxデスクトップ環境で使用できるようになりました。しかし、Linuxを使用するときによくやる、マシンルームにある高性能な計算機から画面のみ転送してクライアントで操作するということが今のままではできません。色々調べたところコンテナ内のアプリケーションの画面を転送してクライアントで動作させた実績はあるようです。例えば、"ILM - Pipeline in the cloud"ではクラウド上の計算機からVirtualGLを使用しているようです。これは課題として面白いですし、実用性も高いので手元でも実現してみたい技術のひとつです。

    今回でやっとベースになる環境が整いました。次回からはUSDを使用したシーン構築やレンダリングを行なっていきたいとおもいます。



    第4回の公開は、2018年9月を予定しております。

    プロフィール

    • 痴山紘史
      日本CGサービス(JCGS) 代表

      大学卒業後、株式会社IMAGICA入社。放送局向けリアルタイムCGシステムの構築・運用に携わる。その後、株式会社リンクス・デジワークスにて映画・ゲームなどの映像制作に携わる。2010年独立、現職。映像制作プロダクション向けのパイプラインの開発と提供を行なっている。新人パパ。娘かわいい。
      @chiyama