生成AI

他人の顔でYouTuber? 写真内の顔を思うように動かして話をさせるAI「Live Portrait」をM1 Mac で動かしてみた

はじめに

Live Portraitは、中国の快手(Kuaishou)が開発したAIのオープンソースプロジェクトです。

画像から動画を生成することができて、他人や漫画のキャラクターの顔を思うように動かして話をさせたり、好きな表情にさせることができます。

この技術が面白いと思い、手元の Mac の環境で動かしてみたので、そのときにハマったポイントなどを書いていきたいと思います。

環境構築

Github の Getting Start の通りに進めていきます。しかし、pip install のところで以下のエラーが発生しました。

ERROR: Ignored the following versions that require a different python version: 1.14.0 Requires-Python >=3.10; 1.14.0rc1 Requires-Python >=3.10; 1.14.0rc2 Requires-Python >=3.10
ERROR: Could not find a version that satisfies the requirement onnxruntime-gpu==1.18.0 (from versions: none)
ERROR: No matching distribution found for onnxruntime-gpu==1.18.0

onnxruntime-gpu がインストールできないらしく、Python 3.9 ~ 3.12 まですべてのバージョンを試しましたが、インストールできませんでした。

こちらは M1 Mac の問題でライブラリを onnxruntime-silicon に変更するとインストールすることができました。

onnxruntime-gpu==1.18.0
onnxruntime-silicon # こちらに変更する

今度は pip install で下記の箇所でコケました。

Collecting networkx
ERROR: Could not install packages due to an OSError: Could not find a suitable TLS CA certificate bundle, invalid path: /Users/****/Desktop/projects/LivePortrait/.venv/lib/python3.9/site-packages/pip/_vendor/certifi/cacert.pem

こちらのエラーは以下のように対応することで解決することができました。

$ (security find-certificate -a -p ls /System/Library/Keychains/SystemRootCertificates.keychain &&        security find-certificate -a -p ls /Library/Keychains/System.keychain) > $HOME/.mac-ca-roots
$ export REQUESTS_CA_BUNDLE="$HOME/.mac-ca-roots"
$ source ~/.bashrc # シェルが Bash の場合

こちらの stackover flow の記事を参考にしています。

これですべてのライブラリをインストールすることができました!

さっそく python reference を実行したのですが、以下エラーになり実行できませんでした。

python inference.py
Traceback (most recent call last):
  File "/Users/sakaishun/Desktop/projects/LivePortrait/inference.py", line 33, in <module>
    main()
  File "/Users/sakaishun/Desktop/projects/LivePortrait/inference.py", line 23, in main
    live_portrait_pipeline = LivePortraitPipeline(
  File "/Users/sakaishun/Desktop/projects/LivePortrait/src/live_portrait_pipeline.py", line 38, in __init__
    self.live_portrait_wrapper: LivePortraitWrapper = LivePortraitWrapper(cfg=inference_cfg)
  File "/Users/sakaishun/Desktop/projects/LivePortrait/src/live_portrait_wrapper.py", line 28, in __init__
    self.appearance_feature_extractor = load_model(cfg.checkpoint_F, model_config, cfg.device_id, 'appearance_feature_extractor')
  File "/Users/sakaishun/Desktop/projects/LivePortrait/src/utils/helper.py", line 97, in load_model
    model = AppearanceFeatureExtractor(**model_params).cuda(device)
  File "/Users/sakaishun/.pyenv/versions/3.9.18/lib/python3.9/site-packages/torch/nn/modules/module.py", line 915, in cuda
    return self._apply(lambda t: t.cuda(device))
  File "/Users/sakaishun/.pyenv/versions/3.9.18/lib/python3.9/site-packages/torch/nn/modules/module.py", line 779, in _apply
    module._apply(fn)
  File "/Users/sakaishun/.pyenv/versions/3.9.18/lib/python3.9/site-packages/torch/nn/modules/module.py", line 779, in _apply
    module._apply(fn)
  File "/Users/sakaishun/.pyenv/versions/3.9.18/lib/python3.9/site-packages/torch/nn/modules/module.py", line 804, in _apply
    param_applied = fn(param)
  File "/Users/sakaishun/.pyenv/versions/3.9.18/lib/python3.9/site-packages/torch/nn/modules/module.py", line 915, in <lambda>
    return self._apply(lambda t: t.cuda(device))
  File "/Users/sakaishun/.pyenv/versions/3.9.18/lib/python3.9/site-packages/torch/cuda/__init__.py", line 284, in _lazy_init
    raise AssertionError("Torch not compiled with CUDA enabled")
AssertionError: Torch not compiled with CUDA enabled

以下を参考に色々試すも解決しませんでした。。

色々調べると cuda は NVIDIA の GPU で、Mac ではサポートが終了したようでした。。

なので、cuda(device) となっているところを to("mps") に修正していきます。mps は Mac の GPU です。

また、実行時今度は以下のエラーが発生しました。

Animating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   0% -:--:--
Traceback (most recent call last):
  File "/Users/sakaishun/Desktop/projects/LivePortrait/inference.py", line 33, in <module>
    main()
  File "/Users/sakaishun/Desktop/projects/LivePortrait/inference.py", line 29, in main
    live_portrait_pipeline.execute(args)
  File "/Users/sakaishun/Desktop/projects/LivePortrait/src/live_portrait_pipeline.py", line 167, in execute
    out = self.live_portrait_wrapper.warp_decode(f_s, x_s, x_d_i_new)
  File "/Users/sakaishun/Desktop/projects/LivePortrait/src/live_portrait_wrapper.py", line 259, in warp_decode
    ret_dct = self.warping_module(feature_3d, kp_source=kp_source, kp_driving=kp_driving)
  File "/opt/anaconda3/envs/myenv/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1532, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/opt/anaconda3/envs/myenv/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1541, in _call_impl
    return forward_call(*args, **kwargs)
  File "/Users/sakaishun/Desktop/projects/LivePortrait/src/modules/warping_network.py", line 52, in forward
    dense_motion = self.dense_motion_network(
  File "/opt/anaconda3/envs/myenv/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1532, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/opt/anaconda3/envs/myenv/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1541, in _call_impl
    return forward_call(*args, **kwargs)
  File "/Users/sakaishun/Desktop/projects/LivePortrait/src/modules/dense_motion.py", line 81, in forward
    heatmap = self.create_heatmap_representations(deformed_feature, kp_driving, kp_source)  # (bs, 1+num_kp, 1, d, h, w)
  File "/Users/sakaishun/Desktop/projects/LivePortrait/src/modules/dense_motion.py", line 62, in create_heatmap_representations
    zeros = torch.zeros(heatmap.shape[0], 1, spatial_size[0], spatial_size, spatial_size).type(heatmap.type()).to(heatmap.device)
ValueError: invalid type: 'torch.mps.FloatTensor'

こちらも M1 Mac の問題で、以下のように修正すると動くようになりました。

# (変更前)
zeros = torch.zeros(heatmap.shape[0], 1, spatial_size[0], spatial_size, spatial_size).type(heatmap.type()).to(heatmap.device)

# (変更後)
zeros = torch.zeros(heatmap.shape[0], 1, spatial_size[0], spatial_size, spatial_size, dtype=torch.float32).to(heatmap.device)

これで再度 python reference.py をすると・・

動画が作成されました!!

こちらのリポジトリでは、他に app.py があり、こちらを実行すると localhost が立ち上がり以下のようにブラウザ上で画像や動画をアップロードすることができました。

また、speed.py ファイルもあり、こちらを実行するとベンチマークを取ることができました。しかし、mps で行うことができず、cpu を用いました。

python speed.py

Number of parameters for Appearance Feature Extractor: 0.84 M
Number of parameters for Motion Extractor: 28.12 M
Number of parameters for Warping Network: 45.53 M
Number of parameters for SPADE Decoder: 55.37 M
Number of parameters for part_0 in Stitching and Retargeting Modules: 0.05 M
Number of parameters for part_1 in Stitching and Retargeting Modules: 0.14 M
Number of parameters for part_2 in Stitching and Retargeting Modules: 0.04 M
Average inference time for Appearance Feature Extractor over 100 runs: 755.10 ms (std: 77.60 ms)
Average inference time for Motion Extractor over 100 runs: 1139.13 ms (std: 243.80 ms)
Average inference time for Warping Network over 100 runs: 16046.69 ms (std: 3088.22 ms)
Average inference time for SPADE Decoder over 100 runs: 2171.84 ms (std: 183.41 ms)
Average inference time for Retargeting Models over 100 runs: 4.01 ms (std: 2.41 ms)

今のところ、こちらのリポジトリでできることはそれだけでした。

X (旧Twitter)でリアルタイムに生成できるというポストがありましたが、今のところそれはまだできないようです。

ただ、開発は続いているので今後できるようになっていく可能性はあるので、今後も追っていきたいと思います。

参考

https://note.com/__olender/n/na743022b58a3

まとめ

M1 Mac で Live Portrait を動かすという記事でした。Stable Diffusion などのような他のオープンソースでも NVIDIA の GPU が前提になっていて、Mac で動かすには少し手間がかかる印象でした。

ソフトウェア開発の世界では Mac が当たり前でしたが、生成 AI では Windows の方がまだ何かと有利というのを実感して、Windows も買おうかと検討中です。

ABOUT ME
sakai
東京在住の30歳。元々は車部品メーカーで働いていてましたが、プログラミングに興味を持ちスクールに通ってエンジニアになりました。 そこからベンチャー → メガベンチャー → 個人事業主になりました。 最近は生成 AI 関連の業務を中心にやっています。 ヒカルチャンネル(Youtube)とワンピースが大好きです!