How to run SkyReels-V2 on a cloud GPU

Rent a GPU on Deploy, then open a terminal in JupyterLab or over SSH. Install SkyReels-V2 from the official SkyworkAI/SkyReels-V2 repository the way the README prints, then run the text-to-video, image-to-video, or diffusion-forcing command that file prints. Copy the mp4 from result/ or from the diffusers filename before you destroy the instance, because destroying the instance deletes its disk.

Wan 2.2 is a different repository: How to run Wan 2.2 video generation on a cloud GPU. Wan2.1 VACE is a different section, and those VACE commands print no GPU GB figure: How to run Wan2.1 VACE on a cloud GPU. Which card the Wan README names is Which GPU for Wan video generation. HunyuanVideo’s README publishes 60GB, 45G, and 80GB: How to run HunyuanVideo on a cloud GPU. LTX-Video is How to run LTX-Video on a cloud GPU. FramePack’s README asks for at least 6GB: How to run FramePack on a cloud GPU. If the process runs out of memory: How to fix CUDA out of memory on a cloud GPU.

The repository LICENSE.txt is the Skywork community terms. The English section says community use of the Skywork model requires the Skywork Community License, and that the model supports commercial use if you abide by the terms in that license. The GitHub license field on 2026-11-13 was NOASSERTION. The model cards for Skywork/SkyReels-V2-DF-14B-540P, Skywork/SkyReels-V2-T2V-14B-540P, and Skywork/SkyReels-V2-I2V-1.3B-540P that day had cardData.license other, license_name skywork-license, license_link LICENSE, and gated false, lastModified 2025-04-25T02:32:47.000Z, 2025-04-25T02:31:54.000Z, and 2025-04-25T02:35:11.000Z. Read LICENSE.txt before you redistribute the program or the weights.

The commands below are copied from the upstream files named in each step. They were not run on a CloudGPU instance for this page. Anything this page adds around them is marked.

What the README says about memory

The diffusion-forcing note in README.md (commit 9351d13152207cc04de780e055346b08ade0b851, 2026-01-29) says generating a 540P video using the 1.3B model requires approximately 14.7GB peak VRAM, while the same resolution video using the 14B model demands around 51.2GB peak VRAM. The text-to-video note says generating a 540P video using the 1.3B model requires approximately 14.7GB peak VRAM, while the same resolution video using the 14B model demands around 43.4GB peak VRAM. The prompt-enhancer paragraph says the peak memory of the GPU is 64G+ if you use --prompt_enhancer. Those three sentences are separate. This page did not remeasure them. The README also has a human-evaluation section and a V-Bench section. This page does not copy those tables.

The same notes say --offload is how the examples run, and the parameter table says --offload offloads model components to CPU to reduce VRAM usage and marks the recommended value True. The notes do not say whether 14.7GB, 43.4GB, or 51.2GB were measured with that flag. This page does not add that claim. To lower peak VRAM on a long diffusion-forcing run, the note says to lower --base_num_frames, for example to 77 or 57, and keep --num_frames. It says this may slightly reduce video quality and should not be set too small.

GET /v1/public/compute-capabilities does not list GPUs. It returns feature flags. The memory column is vram_gb from gpu-prices.json, updated_at 2026-11-13T14:01:30.465Z. GET /v1/public/gpu-catalog the same day (generated_at 2026-11-13T14:01:31.438Z) listed the same names and the same vram_gb values, plus Ascend 910B at 64, which is not in gpu-prices.json and is not listed here. The catalog response also includes an availability field. This page does not copy it. Every prices row has gpu_count 1. Every catalog row has min_gpu_count 1. The smallest vram_gb in that file is 8, on RTX 2080. Catalog rows below 14.7 are RTX 2080 (8), RTX 3080 (10), RTX 2080 Ti (11), and RTX 3080 Ti (12). The next catalog value is 16. Catalog rows below 43.4 are those four plus V100 16G (16), A30 (24), RTX 3090 (24), RTX 4090 (24), RTX 4090D (24), RTX 4080 SUPER 32G (32), RTX 5090 (32), RTX 5090D (32), V100 32G (32), A100 40G (40), and A800 40G (40). The next catalog value is 48. Catalog rows below 51.2 are those plus A40 (48), RTX 4090 48G (48), RTX 4090D 48G (48), and RTX A6000 (48). The next value in gpu-prices.json is 72. No row in that file is 64. The prompt-enhancer line is 64G+. This page did not run SkyReels-V2 and does not mark a row as enough. Which listing you can start is on Deploy.

The catalog template list had no SkyReels template.

Catalog name vram_gb
RTX 2080 8
RTX 3080 10
RTX 2080 Ti 11
RTX 3080 Ti 12
V100 16G 16
A30 24
RTX 3090 24
RTX 4090 24
RTX 4090D 24
RTX 4080 SUPER 32G 32
RTX 5090 32
RTX 5090D 32
V100 32G 32
A100 40G 40
A800 40G 40
A40 48
RTX 4090 48G 48
RTX 4090D 48G 48
RTX A6000 48
NVIDIA RTX PRO 5000 72G 72
RTX PRO 5000 72G 72
A100 80G 80
A800 80G 80
H800 80
RTX 6000D 83
H20 96G 96
RTX PRO 6000 96G 96
RTX PRO 6000 Max-Q 96
H20-3e 141G 141

Install

On Deploy, choose Raw GPU. The README’s installation comment says the test environment uses Python 3.10.12. The install block, copied.

git clone https://github.com/SkyworkAI/SkyReels-V2
cd SkyReels-V2
pip install -r requirements.txt

requirements.txt pins torch==2.5.1, torchvision==0.20.1, and transformers==4.49.0, sets diffusers>=0.31.0, and lists flash_attn with no version. The README block does not pass --index-url. requirements.txt was commit 7487eb40e840116b25692557d030b40b68ef0e49, committed 2025-04-20T08:32:30Z. This page did not run pip.

The RTX 5090 guide says that card is compute capability 12.0 (sm_120) and that PyTorch 2.7 and later, on a build for CUDA 12.8 or newer, is the line that announced support. This file pins torch==2.5.1 and the README does not pass a CUDA wheel index. This page did not re-test SkyReels-V2 on an RTX 5090. Catalog RTX 5090 and RTX 5090D are 32. That is the catalog number only.

Weights

The README says you can download the models from Hugging Face and then set the model path in the generation commands. The model table links these ids, among rows it marks Coming Soon. This page does not invent an id for a Coming Soon row.

  • Diffusion forcing: Skywork/SkyReels-V2-DF-1.3B-540P, Skywork/SkyReels-V2-DF-14B-540P, Skywork/SkyReels-V2-DF-14B-720P
  • Text-to-video: Skywork/SkyReels-V2-T2V-14B-540P, Skywork/SkyReels-V2-T2V-14B-720P
  • Image-to-video: Skywork/SkyReels-V2-I2V-1.3B-540P, Skywork/SkyReels-V2-I2V-14B-540P, Skywork/SkyReels-V2-I2V-14B-720P

The table’s recommended height, width, and frame cells are 544 * 960 * 97f for the 540P rows and 720 * 1280 * 121f for the 720P rows. Those are the table’s cells. This page does not treat them as a GPU GB figure.

download_model in skyreels_v2_infer/modules/__init__.py calls snapshot_download(repo_id=model_id) when model_id is not an existing path, and returns that path. generate_video.py and generate_video_df.py both assign args.model_id = download_model(args.model_id) before they build the pipeline. The commands below set model_id to a hub id. That id is not a local path, so the function downloads. This page did not run the download. skyreels_v2_infer/modules/__init__.py was commit 3e6371d4127ff9c2d5ef37b7f68fc41508c45f5b, committed 2025-04-21T04:44:54Z.

Diffusion forcing

The README’s synchronous long-video command, copied. The heading above it says synchronous generation for a 10s video.

model_id=Skywork/SkyReels-V2-DF-14B-540P
python3 generate_video_df.py \
  --model_id ${model_id} \
  --resolution 540P \
  --ar_step 0 \
  --base_num_frames 97 \
  --num_frames 257 \
  --overlap_history 17 \
  --prompt "A graceful white swan with a curved neck and delicate feathers swimming in a serene lake at dawn, its reflection perfectly mirrored in the still water as mist rises from the surface, with the swan occasionally dipping its head into the water to feed." \
  --addnoise_condition 20 \
  --offload \
  --teacache \
  --use_ret_steps \
  --teacache_thresh 0.3

The asynchronous command in the same section, copied. The heading above it says asynchronous generation for a 30s video.

model_id=Skywork/SkyReels-V2-DF-14B-540P
python3 generate_video_df.py \
  --model_id ${model_id} \
  --resolution 540P \
  --ar_step 5 \
  --causal_block_size 5 \
  --base_num_frames 97 \
  --num_frames 737 \
  --overlap_history 17 \
  --prompt "A graceful white swan with a curved neck and delicate feathers swimming in a serene lake at dawn, its reflection perfectly mirrored in the still water as mist rises from the surface, with the swan occasionally dipping its head into the water to feed." \
  --addnoise_condition 20 \
  --offload

The note under those commands says you can switch --num_frames, for example --num_frames 257 for a 10s video, --num_frames 377 for a 15s video, --num_frames 737 for a 30s video, and --num_frames 1457 for a 60s video. It says the number is aligned with training parameters rather than a strict frame count for that duration. It says --ar_step 5 enables asynchronous inference, and that --causal_block_size 5 is recommended for that mode and is not supposed to be set for synchronous generation. It says asynchronous inference takes more steps to diffuse the whole sequence and will be slower than synchronous mode. This page did not time either command. --addnoise_condition of 20 is the note’s recommended value, and the note says it is recommended not to exceed 50.

For image-to-video on this script, the note says to add --image ${image_path} and that a text-to-video-like prompt is better. Video extension passes --video_path ${video_path}. Start and end frame control passes --image ${image} and --end_image ${end_image}. Those three blocks are in the README. This page does not repeat every flag list.

generate_video_df.py joins result and --outdir. The default --outdir is diffusion_forcing, so the directory the script builds is result/diffusion_forcing. The file name is the first 100 characters of the prompt, with slashes removed, then the seed, then a timestamp from time.strftime("%Y-%m-%d_%H-%M-%S"), with an .mp4 suffix. generate_video_df.py was commit 7d0969eb056c9f9bd16bf0832e5d66b496288c8a, committed 2025-05-27T08:47:20Z. The README parameter table says --outdir ./video_out and describes it as the directory where generated videos will be saved. That cell is ./video_out. The script joins result and the argument. The documented diffusion-forcing commands do not pass --outdir.

The diffusion-forcing diffusers snippet calls export_to_video(output, "T2V.mp4", fps=24, quality=8). The image-to-video and video-extension diffusers snippets call export_to_video(output, "output.mp4", fps=24, quality=8). Those files are written in the working directory of the snippet. This page did not run the snippets.

Text-to-video and image-to-video

The text-to-video command, copied.

model_id=Skywork/SkyReels-V2-T2V-14B-540P
python3 generate_video.py \
  --model_id ${model_id} \
  --resolution 540P \
  --num_frames 97 \
  --guidance_scale 6.0 \
  --shift 8.0 \
  --fps 24 \
  --prompt "A serene lake surrounded by towering mountains, with a few swans gracefully gliding across the water and sunlight dancing on the surface." \
  --offload \
  --teacache \
  --use_ret_steps \
  --teacache_thresh 0.3

The note says an image-to-video model must get --image ${image_path}. It recommends --guidance_scale 5.0 and --shift 3.0 for an image-to-video model. The parameter table on the same page says --shift is 8.0 for text-to-video and 5.0 for image-to-video, and --guidance_scale is 6.0 for text-to-video and 5.0 for image-to-video. The note’s 3.0 and the table’s 5.0 are both printed. This page does not pick one. The table says --inference_steps recommended value 50. generate_video.py defaults --inference_steps to 30. The command above does not pass --inference_steps. The table’s recommended --teacache value is False. The command above passes --teacache. The argparse help for --teacache_thresh names speed multipliers. This page does not copy those multipliers.

generate_video.py joins result and --outdir. The default --outdir is video_out, so the directory the script builds is result/video_out. The file name uses the same prompt, seed, and timestamp pattern as generate_video_df.py. generate_video.py was commit b36b6a6a0efd263e82db64a1115cf79e45afda41, committed 2025-04-25T02:02:42Z. The documented command does not pass --outdir.

The text-to-video diffusers snippet, copied. export_to_video writes video.mp4 in the working directory. The height and width in the call are 544 and 960. Those are frame sizes in the snippet. The comment in the snippet also names Skywork/SkyReels-V2-T2V-14B-540P-Diffusers.

import torch
from diffusers import (
    SkyReelsV2Pipeline,
    UniPCMultistepScheduler,
    AutoencoderKLWan,
)
from diffusers.utils import export_to_video

vae = AutoencoderKLWan.from_pretrained(
    "Skywork/SkyReels-V2-T2V-14B-720P-Diffusers",
    subfolder="vae",
    torch_dtype=torch.float32,
)
pipe = SkyReelsV2Pipeline.from_pretrained(
    "Skywork/SkyReels-V2-T2V-14B-720P-Diffusers",
    vae=vae,
    torch_dtype=torch.bfloat16,
)
flow_shift = 8.0  # 8.0 for T2V, 5.0 for I2V
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, flow_shift=flow_shift)
pipe = pipe.to("cuda")

prompt = "A cat and a dog baking a cake together in a kitchen. The cat is carefully measuring flour, while the dog is stirring the batter with a wooden spoon. The kitchen is cozy, with sunlight streaming through the window."

output = pipe(
    prompt=prompt,
    num_inference_steps=50,
    height=544,
    width=960,
    guidance_scale=6.0,  # 6.0 for T2V, 5.0 for I2V
    num_frames=97,
).frames[0]
export_to_video(output, "video.mp4", fps=24, quality=8)

The image-to-video diffusers snippet calls export_to_video(output, "video.mp4", fps=24, quality=8) and opens path/to/image.png. Its model id in the call is Skywork/SkyReels-V2-I2V-14B-720P-Diffusers. This page did not run the snippets.

Prompt enhancer and multi-GPU

The prompt enhancer paragraph says the enhancer is based on Qwen/Qwen2.5-32B-Instruct and is turned on with --prompt_enhancer. It says the flag is not allowed together with --use_usp. The separate script, copied. PromptEnhancer defaults model_name to Qwen/Qwen2.5-32B-Instruct. prompt_enhancer.py was the same commit as requirements.txt, 7487eb40e840116b25692557d030b40b68ef0e49.

cd skyreels_v2_infer/pipelines
python3 prompt_enhancer.py --prompt "A serene lake surrounded by towering mountains, with a few swans gracefully gliding across the water and sunlight dancing on the surface."

The multi-GPU section says it uses xDiT USP and shows a 2-GPU example. The text-to-video example, copied. The diffusion-forcing example is torchrun --nproc_per_node=2 generate_video_df.py with --use_usp and --offload. Every prices row has gpu_count 1, and every catalog row has min_gpu_count 1. This page does not claim a listing with two GPUs.

model_id=Skywork/SkyReels-V2-T2V-14B-540P
torchrun --nproc_per_node=2 generate_video.py \
  --model_id ${model_id} \
  --resolution 540P \
  --num_frames 97 \
  --guidance_scale 6.0 \
  --shift 8.0 \
  --fps 24 \
  --offload \
  --prompt "A serene lake surrounded by towering mountains, with a few swans gracefully gliding across the water and sunlight dancing on the surface." \
  --use_usp \
  --seed 42

ComfyUI

The README does not document a ComfyUI install. The ComfyUI examples top-level directory list on 2026-11-13 had no directory named skyreels. Examples HEAD was f9431bb000ce792094ff345446e22cac1ea6cef3, committed 2025-11-26T20:33:58Z. Installing ComfyUI itself is How to install ComfyUI and ComfyUI-Manager on a cloud GPU. The video quickstart does not print a Gradio launch, so this page does not state a port for these commands.

When it fails

CUDA out of memory. The figures in the memory section are the ones the README prints. The examples already pass --offload. The diffusion-forcing note also says to lower --base_num_frames. If the process raises that error, use how to fix CUDA out of memory on a cloud GPU.

“CUDA error: no kernel image is available for execution on the device” on an RTX 5090. See the install section. This page did not re-test the pinned torch build on that card.

flash_attn does not install. requirements.txt lists flash_attn with no version, and the README does not print a second install. This page did not run pip and does not name a replacement.

Save the video, then destroy

Copy result/video_out from generate_video.py, result/diffusion_forcing from generate_video_df.py when you do not pass --outdir, and video.mp4, T2V.mp4, or output.mp4 from the diffusers snippet you ran, before you destroy the instance. Save your work before you destroy a cloud GPU is the checklist. The terms say data on local instance storage is permanently deleted when the instance is destroyed.

The pricing page FAQ states the billing rule in these words:

Per-minute options have a 1-minute minimum; unused prepaid minutes are refunded when you destroy the instance. Some configurations use whole-hour billing with a 1-hour minimum; unused time within a charged hour is not refunded on voluntary stop. The billing period, minimum charge and initial prepayment are shown before confirmation. No subscription.

Frequently asked questions

What peak VRAM figures does the SkyReels-V2 README print?

The diffusion-forcing note says a 540P video with the 1.3B model requires approximately 14.7GB peak VRAM, and the same resolution with the 14B model demands around 51.2GB peak VRAM. The text-to-video note repeats approximately 14.7GB for the 1.3B model at 540P and says the 14B model demands around 43.4GB peak VRAM. The prompt-enhancer paragraph says the peak memory of the GPU is 64G+ if you use --prompt_enhancer. The smallest vram_gb in gpu-prices.json (updated_at 2026-11-13T14:01:30.465Z) is 8, on RTX 2080. This page did not run SkyReels-V2 and does not mark a row as enough. Which listing you can start is on https://cloudgpu.app/deploy.

Where does the script write the video?

generate_video.py joins result and --outdir. The default outdir is video_out, so the directory the script builds is result/video_out. The README parameter table says --outdir ./video_out. generate_video_df.py uses the same join and defaults outdir to diffusion_forcing, so that path is result/diffusion_forcing. The file name is the first 100 characters of the prompt, with slashes removed, then the seed and a timestamp, with an .mp4 suffix. The diffusers snippets call export_to_video with T2V.mp4, output.mp4, or video.mp4. This page did not run the commands.

Does the repository document offload, multi-GPU, and ComfyUI?

The single-GPU examples pass --offload. The parameter table says --offload offloads model components to CPU to reduce VRAM usage and marks it recommended. The multi-GPU section runs torchrun --nproc_per_node=2 with --use_usp. Every gpu_count in gpu-prices.json is 1, and every catalog min_gpu_count is 1. The README does not document a ComfyUI install. The ComfyUI examples top-level directory list on 2026-11-13 had no skyreels directory. This page did not run the multi-GPU command.

Which license covers the code and the weights?

The repository LICENSE.txt is the Skywork community terms. It says community use requires the Skywork Community License, and that the model supports commercial use if you abide by that license. The GitHub license field on 2026-11-13 was NOASSERTION. The cards for Skywork/SkyReels-V2-DF-14B-540P, Skywork/SkyReels-V2-T2V-14B-540P, and Skywork/SkyReels-V2-I2V-1.3B-540P had cardData.license other, license_name skywork-license, and gated false. That wording is the upstream license, not a CloudGPU price and not a storage allowance.

Sources (read 2026-11-13, Asia/Shanghai)

  • SkyReels-V2 README (install, model table, diffusion-forcing and text-to-video commands, 14.7GB / 43.4GB / 51.2GB notes, 64G+ prompt enhancer, --offload, torchrun --nproc_per_node=2, diffusers export_to_video names): https://github.com/SkyworkAI/SkyReels-V2/blob/main/README.md commit 9351d13152207cc04de780e055346b08ade0b851. Repository HEAD is that commit, committed 2026-01-29T05:21:27Z
  • requirements.txt (torch==2.5.1, torchvision==0.20.1, transformers==4.49.0, diffusers>=0.31.0, flash_attn with no version): commit 7487eb40e840116b25692557d030b40b68ef0e49
  • generate_video.py (download_model, default --outdir video_out, default --inference_steps 30, result/ join, mp4 name): commit b36b6a6a0efd263e82db64a1115cf79e45afda41
  • generate_video_df.py (default --outdir diffusion_forcing, same result/ join and mp4 name): commit 7d0969eb056c9f9bd16bf0832e5d66b496288c8a
  • skyreels_v2_infer/modules/__init__.py (snapshot_download when the path does not exist): commit 3e6371d4127ff9c2d5ef37b7f68fc41508c45f5b
  • skyreels_v2_infer/pipelines/prompt_enhancer.py (default Qwen/Qwen2.5-32B-Instruct): commit 7487eb40e840116b25692557d030b40b68ef0e49
  • LICENSE.txt (Skywork community terms, commercial use if you abide by the Skywork Community License): commit 7487eb40e840116b25692557d030b40b68ef0e49. GitHub license field NOASSERTION
  • Model cards Skywork/SkyReels-V2-DF-14B-540P, Skywork/SkyReels-V2-T2V-14B-540P, and Skywork/SkyReels-V2-I2V-1.3B-540P (cardData.license other, license_name skywork-license, gated false), read 2026-11-13
  • ComfyUI examples top-level directories (no skyreels directory): https://github.com/comfyanonymous/ComfyUI_examples commit f9431bb000ce792094ff345446e22cac1ea6cef3
  • Public GPU memory: https://cloudgpu.app/gpu-prices.json (updated_at 2026-11-13T14:01:30.465Z) and https://cloudgpu.app/v1/public/gpu-catalog (generated_at 2026-11-13T14:01:31.438Z). GET /v1/public/compute-capabilities returned feature flags and no GPU list. The catalog had no SkyReels template

Cards you can start are on the Deploy page. Prices are on https://cloudgpu.app/pricing and are not repeated here.

Last updated: 2026-11-13 (Asia/Shanghai).