本篇文章聊聊,如何快速上手 Stable Video Diffusion (SVD) 圖生視頻大模型。
寫在前面
月底計劃在機(jī)器之心的“AI技術(shù)論壇”做關(guān)于使用開源模型 “Stable Diffusion 模型” 做有趣視頻的實戰(zhàn)分享。
因為會議分享時間有限,和之前一樣,比較簡單的部分,就用博客文章的形式來做補充分享吧。
本篇是一篇相關(guān)的補充內(nèi)容,主要聊聊使用開源行業(yè)標(biāo)桿 stability.ai 出品的 Stable Video Diffusion 的快速上手。
本篇文章相關(guān)的代碼保存在 soulteary/docker-stable-video-diffusion,有需要可以自取,歡迎“一鍵三連”。
Stable Video Diffusion
2023 年 11 月末,stability.ai 發(fā)布了 Stable Video Diffusion,依舊是擴(kuò)散模型,但是將圖片技術(shù)衍生到了視頻領(lǐng)域。能夠?qū)㈧o態(tài)圖像作為條件幀,并基于它來生成視頻。如果你對 Stable Diffusion 實踐和開源軟件核心組件解析感興趣,可以移步之前有關(guān)的分享內(nèi)容。
模型的詳細(xì)介紹,我們在官方新聞發(fā)布頁面能夠找到,我就不多贅述了。模型的使用方式類似之前文生圖的 Stable Diffusion,還是簡單的三段式使用方法:“輸入內(nèi)容”、“等待模型處理生成”、“獲取AI 生成結(jié)果”。
所以,我們現(xiàn)在可以在開源模型上,用一張圖片相對快速的生成一小段內(nèi)容強相關(guān)的視頻啦。
相關(guān)的模型,官方一共開源了兩個,一個是基礎(chǔ)版本,能夠生成 14 幀 1024x576 分辨率內(nèi)容的基礎(chǔ)模型 stabilityai/stable-video-diffusion-img2vid,另外一個是基于基礎(chǔ)模型進(jìn)行 finetune 得到的 “XT” 模型:stabilityai/stable-video-diffusion-img2vid-xt,它能夠生成相同分辨率 25 幀的內(nèi)容。借助 AutoencoderKL(官方文檔中稱作 F8 解碼器)和對 VAE 模型的 finetune,進(jìn)一步提升了視頻內(nèi)容質(zhì)量和一致性,降低了畫面閃爍的問題。
在官方的介紹中,當(dāng)時發(fā)布模型時的生成效果比 GEN-2 和 PikaLabs 更受到用戶的歡迎。
當(dāng)然,這個模型還比較早期,有一些明顯的缺陷:
- 目前直接使用 SVD 生成的視頻都很短,通常在 5 秒之內(nèi),并且暫時無法實現(xiàn)照片級別的畫面真實感。
- 生成結(jié)果和早期 Stable Diffusion 類似,比較不可控,可能會生成距離預(yù)期偏差比較大的沒有運動或者運動頻率特別慢的視頻鏡頭畫面。
- 暫時無法通過文本控制干預(yù)視頻的生成。
- 暫時無法呈現(xiàn)清晰的文本內(nèi)容。
- 通常無法正確的處理人物內(nèi)容,特別是人臉。
- 模型的
clip_vision_model
編碼器在解析圖片內(nèi)容時,會損失一些信息。
當(dāng)然,上述問題的解決都只是時間問題,開源模型的演進(jìn)速度是非常快的,所以不妨先撿起這張船票,一起揚帆起航。
基礎(chǔ)環(huán)境準(zhǔn)備
我個人比較傾向使用 Docker 作為運行環(huán)境,在投入很少額外資源的情況下,能夠快速獲得純凈、可復(fù)現(xiàn)的一致性非常棒的環(huán)境。
如果你選擇 Docker 路線,不論你的設(shè)備是否有顯卡,都可以根據(jù)自己的操作系統(tǒng)喜好,參考這兩篇來完成基礎(chǔ)環(huán)境的配置《基于 Docker 的深度學(xué)習(xí)環(huán)境:Windows 篇》、《基于 Docker 的深度學(xué)習(xí)環(huán)境:入門篇》。當(dāng)然,使用 Docker 之后,你還可以做很多事情,比如:之前幾十篇有關(guān) Docker 的實踐,在此就不贅述啦。
除此之外,為了高效運行模型,我推薦使用 Nvidia 官方的容器鏡像(nvcr.io/nvidia/pytorch:23.12-py3),以及 HuggingFace 出品的 Diffusers 工具包。
我們可以基于上面的內(nèi)容,快速折騰一個干凈、高效的基礎(chǔ)運行環(huán)境:
FROM nvcr.io/nvidia/pytorch:23.12-py3
RUN pip install transformers==4.35.2 gradio==4.13.0 diffusers==0.25.0 accelerate==0.25.0
RUN pip install opencv-fixer==0.2.5
RUN python -c "from opencv_fixer import AutoFix; AutoFix()"
WORKDIR /app
在本地創(chuàng)建一個名為 docker
的目錄,將上面的代碼保存到文件夾內(nèi),文件名稱為 Dockerfile
,然后使用下面的命令完成鏡像的構(gòu)建,基礎(chǔ)工作就準(zhǔn)備好了一半:
docker build -t soulteary/svd-runtime -f docker/Dockerfile .
當(dāng)然,如果你和我一樣,喜歡“偷懶”,可以用文字開頭提到的示例項目中的文件直接開搞:
# 下載項目代碼
git clone https://github.com/soulteary/docker-stable-video-diffusion.git
# 切換工作目錄
cd docker-stable-video-diffusion
# 構(gòu)建基礎(chǔ)環(huán)境鏡像
docker build -t soulteary/svd-runtime -f docker/Dockerfile .
# 如果你希望速度快一些,可以用這條命令替代上面的命令
docker build -t soulteary/svd-runtime -f docker/Dockerfile.cn .
等到鏡像構(gòu)建完畢后,我們開始準(zhǔn)備模型文件。
修正 Nvidia 鏡像中的 OpenCV 依賴問題
如果你仔細(xì)看上面的 Docker 鏡像準(zhǔn)備文件的內(nèi)容,你會發(fā)現(xiàn)有這么兩行內(nèi)容:
RUN pip install opencv-fixer==0.2.5
RUN python -c "from opencv_fixer import AutoFix; AutoFix()"
這個兩條命令可以解決從 2023 年 6 月開始的 Nvidia 官方鏡像適配 Stable Diffusion Video 相關(guān)模型,在使用 Diffusers 等 HuggingFace 工具保存視頻文件時,本質(zhì)上和 module 'cv2.dnn' has no attribute 'DictValue'
相關(guān)的報錯問題。
這個問題在社區(qū)早些時候有被反饋(opencv/opencv-python #884),主要原因是在安裝 numpy 時被帶入一起安裝的版本過舊 opencv 導(dǎo)致的兼容性問題。比較 Trick 的是我們并不能通過簡單執(zhí)行 pip install 來更新軟件包,需要遵從帖子進(jìn)行一些手動清理安裝,才能將問題解決。
所以,我寫了一個簡單的開源小工具,來自動修正這個問題,項目開源地址在:soulteary/opencv-fixer,如果你在其他模型相關(guān)的使用遇到了類似問題,都可以試試它。
下載模型
我們來完成鏡像準(zhǔn)備之外的 50% 的準(zhǔn)備工作,下載模型。不論你從哪里獲取模型,建議你在得到模型后進(jìn)行文件 Hash 驗證:
shasum svd_xt.safetensors
a74f28bca18f1814b1447c391450b7f720b3b97e
shasum svd_xt_image_decoder.safetensors 1d6f36c441df4a17005167986b12720db1b118f2
你可以根據(jù)你的實際網(wǎng)絡(luò)情況,來選擇到底是從 HuggingFace 下載模型還是從 ModelScope 來下載模型,如果你選擇的是 Model Scope,別忘記在你下載完模型之后,再從 HuggingFace 進(jìn)行下倉庫內(nèi)容除兩個大尺寸模型文件之外的內(nèi)容更新。
關(guān)于模型的快速下載,我在之前的文章里多次提到過,如果你選擇使用 HuggingFace 來下載模型和包含最新的倉庫程序文件:
# 安裝下載工具
pip install huggingface-cli
# 下載我們所需要的模型
huggingface-cli download --resume-download --local-dir-use-symlinks False stabilityai/stable-video-diffusion-img2vid-xt --local-dir ./models/
如果你在訪問網(wǎng)絡(luò)時,遇到了一些問題,可以搭配使用社區(qū)網(wǎng)友提供的加速鏡像:
HF_ENDPOINT=https://hf-mirror.com huggingface-cli download --resume-download --local-dir-use-symlinks False stabilityai/stable-video-diffusion-img2vid-xt --local-dir ./models/
或者,使用官方提供的新版本工具進(jìn)行更快速度的下載:
HF_ENDPOINT=https://hf-mirror.com HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download --resume-download --local-dir-use-symlinks False stabilityai/stable-video-diffusion-img2vid-xt --local-dir ./models/
如果你選擇使用 ModelScope,同樣比較簡單,但是需要注意的是,ModelScope 中的內(nèi)容很多時候會比 HuggingFace 上的內(nèi)容舊,所以推薦在下載完畢之后,再檢查是否需要使用 HuggingFace 上的內(nèi)容做更新替換:
# 下載安裝工具
pip install modelscope
# 下載模型
from modelscope import snapshot_download
snapshot_download('AI-ModelScope/stable-video-diffusion-img2vid-xt', cache_dir="./models/")
模型下載好之后,我們可以整理下目錄結(jié)構(gòu),保持 Models 目中有我們下載好的模型就好:
├── docker
│ ├── Dockerfile
│ └── Dockerfile.cn
├── models
│ └── stabilityai
│ └── stable-video-diffusion-img2vid-xt
└── web
編寫模型推理程序
完整的程序文件在這里,算上空格和美觀的換行,大概不到 150 行,我這里再做一些簡化,主要講解下程序的運行流程:
# 若干依賴的引入
import gradio as gr
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import export_to_video
from PIL import Image
# ... 省略其他引用
# 保證樂子,讓隨機(jī)數(shù)范圍大一些
max_64_bit_int = 2 ** 63 - 1
# ... 省略其他準(zhǔn)備工作
# 使用 diffusers 來創(chuàng)建一個 AI Pipeline
pipe = StableVideoDiffusionPipeline.from_pretrained(
"/app/models/stabilityai/stable-video-diffusion-img2vid-xt",
torch_dtype=torch.float16,
variant="fp16",
)
pipe.to("cuda")
# 加載 UNET 和 VAE 模型,讓生成結(jié)果效果更好(關(guān)于這倆模型干啥的,之前的 Stable Diffusion 文章有展開,不贅述
pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)
pipe.vae = torch.compile(pipe.vae, mode="reduce-overhead", fullgraph=True)
# 核心的視頻生成邏輯
def sample(
image: Image,
seed: Optional[int] = 42,
randomize_seed: bool = True,
motion_bucket_id: int = 127,
fps_id: int = 6,
version: str = "svd_xt",
cond_aug: float = 0.02,
decoding_t: int = 3, # 根據(jù)你的顯卡容量來調(diào)整,顯存不多可以調(diào)整到 1
device: str = "cuda",
output_folder: str = output_folder,
):
# ... 省略一些準(zhǔn)備工作
# 調(diào)用 AI Pipeline 生成視頻幀內(nèi)容
frames = pipe(
image,
decode_chunk_size=decoding_t,
generator=torch.manual_seed(seed),
motion_bucket_id=motion_bucket_id,
noise_aug_strength=0.1,
num_frames=25,
).frames[0]
# 保存視頻
export_to_video(frames, video_path, fps=fps_id)
return video_path, seed
# 調(diào)整上傳圖片內(nèi)容的尺寸,模型對處理的圖片尺寸有要求
def resize_image(image: Image, output_size: Tuple[int, int] =(1024, 576)):
# ...省略若干圖片調(diào)整邏輯,圖片模式、尺寸裁剪等等
return cropped_image
# 用于連接視頻生成和 Gradio 界面的“工具人”
def generate(image, seed, randomize_seed, motion_bucket_id, fps_id):
img = resize_image(image, output_size=(1024, 576))
video, seed = sample(img, seed, randomize_seed, motion_bucket_id, fps_id)
return video, seed
# 配置一個 Gradio 網(wǎng)頁界面
app = gr.Interface(
fn=generate,
inputs=[
gr.Image(label="Upload your image", type="pil"),
gr.Slider(label="Seed", ...),
gr.Checkbox(label="Randomize seed", value=True),
gr.Slider(label="Motion bucket id", ...),
gr.Slider(label="Frames per second", ...),
],
outputs=[
gr.PlayableVideo(label="Generated video"),
gr.Textbox(label="Seed", type="text"),
],
)
# 啟動服務(wù),允許我們來玩
if __name__ == "__main__":
app.queue(max_size=2)
app.launch(share=False, server_name="0.0.0.0", ssl_verify=False)
準(zhǔn)備好程序后,我們將程序放置在目錄的根部,然后就可以準(zhǔn)備運行開玩了。
├── app.py
├── docker
│ ├── Dockerfile
│ └── Dockerfile.cn
└── models
└── stabilityai
└── stable-video-diffusion-img2vid-xt
運行模型
因為使用 Docker ,所以運行模型非常簡單,只需要執(zhí)行下面的命令即可:
docker run --rm -it -p 7860:7860 -p 7680:7680 -p 8080:8080 --gpus all --ipc=host --ulimit memlock=-1 -v `pwd`:/app soulteary/svd-runtime python app.py
當(dāng)命令執(zhí)行完畢,我們會看到類似下面的日志:
=============
== PyTorch ==
=============
NVIDIA Release 23.12 (build 76438008)
PyTorch Version 2.2.0a0+81ea7a4
Container image Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
Copyright (c) 2014-2023 Facebook Inc.
Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)
Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu)
Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)
Copyright (c) 2011-2013 NYU (Clement Farabet)
Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston)
Copyright (c) 2006 Idiap Research Institute (Samy Bengio)
Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz)
Copyright (c) 2015 Google Inc.
Copyright (c) 2015 Yangqing Jia
Copyright (c) 2013-2016 The Caffe contributors
All rights reserved.
Various files include modifications (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved.
This container image and its contents are governed by the NVIDIA Deep Learning Container License.
By pulling and using the container, you accept the terms and conditions of this license:
https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license
WARNING: CUDA Minor Version Compatibility mode ENABLED.
Using driver version 525.147.05 which has support for CUDA 12.0. This container
was built with CUDA 12.3 and will be run in Minor Version Compatibility mode.
CUDA Forward Compatibility is preferred over Minor Version Compatibility for use
with this container but was unavailable:
[[Forward compatibility was attempted on non supported HW (CUDA_ERROR_COMPAT_NOT_SUPPORTED_ON_DEVICE) cuInit()=804]]
See https://docs.nvidia.com/deploy/cuda-compatibility/ for details.
The cache for model files in Transformers v4.22.0 has been updated. Migrating your old cache. This is a one-time only operation. You can interrupt this and resume the migration later on by calling `transformers.utils.move_cache()`.
0it [00:00, ?it/s]
Loading pipeline components...: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 12.41it/s]
Running on local URL: http://0.0.0.0:7860
To create a public link, set `share=True` in `launch()`.
然后,我們在瀏覽器訪問容器運行主機(jī)的 IP:7860 就可以開始體驗和驗證 SVD 啦。
在我寫這篇文章的時候,Chrome 新版本和 Gradio 有一些兼容問題,只能下載視頻,而不能在網(wǎng)頁中自動播放視頻,所以如果你手頭有其他的瀏覽器,可以試試用其他的瀏覽器來進(jìn)行 AI 視頻的生成。這里我使用的是 Safari。
打開頁面之后,我們可以選擇一個自己覺得有趣的圖片來進(jìn)行生成,我選擇的是一只正在發(fā)射中的火箭。這里我推薦將選項中的幀率拉到 25 幀,來獲得絲滑到視頻結(jié)果,以及盡量多的拉高視頻的 “motion” 來讓視頻結(jié)果更好。
當(dāng)我們將圖片上傳到 WebUI 后,點擊 “Submit”,讓“火箭發(fā)射”。第一次執(zhí)行的時候,時間會比較久,可能需要花費 1~3 分鐘時間,程序會自動加載相關(guān)的 SVD、UNET、VAE 模型,然后將我們指定的圖片轉(zhuǎn)換為視頻。
等待模型處理完畢后,我們就獲得了火箭繼續(xù)往上飛的視頻啦。
默認(rèn)情況模型消耗資源
在不經(jīng)過優(yōu)化的情況下,我們默認(rèn)會使用 23G+ 的顯存。
如果你希望在小顯存的環(huán)境下完成視頻的推理生成,可以將我提供的項目源代碼中的注釋根據(jù)自己的需求去掉:
# According to your actual needs
#
# pipe.enable_model_cpu_offload()
# pipe.unet.enable_forward_chunking()
當(dāng)開啟 pipe.enable_model_cpu_offload()
后,顯存需求能夠控制在 8GB 之內(nèi),當(dāng)然,視頻的生成時間也會變的非常慢。
實際運行過程中,顯卡的基本狀態(tài)如下:
Every 1.0s: nvidia-smi LEGION-REN9000K-34IRZ: Sun Jan 8 14:48:34 2024
Sun Jan 8 14:48:34 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.147.05 Driver Version: 525.147.05 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:01:00.0 Off | Off |
| 41% 51C P2 71W / 450W | 23200MiB / 24564MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1497 G /usr/lib/xorg/Xorg 75MiB |
| 0 N/A N/A 1606 G /usr/bin/gnome-shell 16MiB |
| 0 N/A N/A 5880 C python 23104MiB |
+-----------------------------------------------------------------------------+
最后
這篇文章就先寫到這里,在準(zhǔn)備分享內(nèi)容的過程中,我會陸續(xù)的再分享一些和 SD 相關(guān)的有趣內(nèi)容,下篇文章再見。
–EOF
我們有一個小小的折騰群,里面聚集了一些喜歡折騰、彼此坦誠相待的小伙伴。
我們在里面會一起聊聊軟硬件、HomeLab、編程上、生活里以及職場中的一些問題,偶爾也在群里不定期的分享一些技術(shù)資料。
關(guān)于交友的標(biāo)準(zhǔn),請參考下面的文章:
致新朋友:為生活投票,不斷尋找更好的朋友
當(dāng)然,通過下面這篇文章添加好友時,請備注實名和公司或?qū)W校、注明來源和目的,珍惜彼此的時間 ??
關(guān)于折騰群入群的那些事
本文使用「署名 4.0 國際 (CC BY 4.0)」許可協(xié)議,歡迎轉(zhuǎn)載、或重新修改使用,但需要注明來源。 署名 4.0 國際 (CC BY 4.0)
本文作者: 蘇洋文章來源:http://www.zghlxwxcb.cn/news/detail-820323.html
創(chuàng)建時間: 2024年01月08日
統(tǒng)計字?jǐn)?shù): 11829字
閱讀時間: 24分鐘閱讀
本文鏈接: https://soulteary.com/2024/01/08/stable-video-diffusion-quick-start-with-docker-and-diffusers.html文章來源地址http://www.zghlxwxcb.cn/news/detail-820323.html
到了這里,關(guān)于使用 Docker 和 Diffusers 快速上手 Stable Video Diffusion 圖生視頻大模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!