はじめに
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 も買おうかと検討中です。