---
slug: training/examples/wan_i2v_14B_480p_crush_smol
title: Wan2.1-I2V-14B-480P Crush-Smol Example
---
**Source:** [examples/training/finetune/wan_i2v_14B_480p/crush_smol](https://github.com/hao-ai-lab/FastVideo/blob/main/examples/training/finetune/wan_i2v_14B_480p/crush_smol)

<a id="wan21-i2v-14b-480p-crush-smol-example"></a>
These are e2e examples scripts for finetuning Wan2.1 I2V 14B 480P on the crush-smol dataset.

## Execute the following commands from `FastVideo/` to run training: {#execute-the-following-commands-from-fastvideo-to-run-training}

### Download crush-smol dataset: {#download-crush-smol-dataset}

`bash examples/datasets/crush-smol/download_dataset.sh`

### Preprocess the videos and captions into latents: {#preprocess-the-videos-and-captions-into-latents}

`bash examples/training/finetune/wan_i2v_14b_480p/crush_smol/preprocess_wan_data_i2v.sh`

### Edit the following file and run finetuning: {#edit-the-following-file-and-run-finetuning}

`bash examples/training/finetune/wan_i2v_14b_480p/crush_smol/finetune_i2v.sh`

## Additional Files {#additional-files}

??? note "finetune_i2v.sh"

    ```sh
    #!/bin/bash
    
    export WANDB_BASE_URL="https://api.wandb.ai"
    export WANDB_MODE=online
    export TOKENIZERS_PARALLELISM=false
    # export FASTVIDEO_ATTENTION_BACKEND=TORCH_SDPA
    
    MODEL_PATH="Wan-AI/Wan2.1-I2V-14B-480P-Diffusers"
    DATA_DIR="data/crush-smol_processed_i2v/combined_parquet_dataset/"
    VALIDATION_DATASET_FILE="$(dirname "$0")/validation.json"
    NUM_GPUS=8
    # export CUDA_VISIBLE_DEVICES=4,5
    # IP=[MASTER NODE IP]
    
    # Training arguments
    training_args=(
      --tracker_project_name "wan_i2v_finetune"
      --output_dir "checkpoints/wan_i2v_finetune"
      --max_train_steps 2000
      --train_batch_size 1
      --train_sp_batch_size 1
      --gradient_accumulation_steps 1
      --num_latent_t 8
      --num_height 480
      --num_width 832
      --num_frames 77
      --enable_gradient_checkpointing_type "full"
    )
    
    # Parallel arguments
    parallel_args=(
      --num_gpus $NUM_GPUS
      --sp_size 8
      --tp_size 1
      --hsdp_replicate_dim 1
      --hsdp_shard_dim 8
    )
    
    # Model arguments
    model_args=(
      --model_path $MODEL_PATH
      --pretrained_model_name_or_path $MODEL_PATH
    )
    
    # Dataset arguments
    dataset_args=(
      --data_path "$DATA_DIR"
      --dataloader_num_workers 1
    )
    
    # Validation arguments
    validation_args=(
      --log_validation
      --validation_dataset_file "$VALIDATION_DATASET_FILE"
      --validation_steps 100
      --validation_sampling_steps "40"
      --validation_guidance_scale "6.0"
    )
    
    # Optimizer arguments
    optimizer_args=(
      --learning_rate 1e-5
      --mixed_precision "bf16"
      --weight_only_checkpointing_steps 1000
      --training_state_checkpointing_steps 1000
      --weight_decay 1e-4
      --max_grad_norm 1.0
    )
    
    # Miscellaneous arguments
    miscellaneous_args=(
      --inference_mode False
      --checkpoints_total_limit 3
      --training_cfg_rate 0.1
      --multi_phased_distill_schedule "4000-1"
      --not_apply_cfg_solver
      --dit_precision "fp32"
      --num_euler_timesteps 50
      --ema_start_step 0
      --enable_gradient_checkpointing_type "full"
    )
    
    # If you do not have 32 GPUs and to fit in memory, you can: 1. increase sp_size. 2. reduce num_latent_t
    torchrun \
      --nnodes 1 \
      --nproc_per_node $NUM_GPUS \
        fastvideo/training/runner.py \
        --pipeline-class WanI2VTrainingPipeline \
        --pipeline-module fastvideo.training.wan_i2v_training_pipeline \
        "${parallel_args[@]}" \
        "${model_args[@]}" \
        "${dataset_args[@]}" \
        "${training_args[@]}" \
        "${optimizer_args[@]}" \
        "${validation_args[@]}" \
        "${miscellaneous_args[@]}"
    
    ```

??? note "finetune_i2v.slurm"

    ```bash
    #!/bin/bash
    #SBATCH --job-name=i2v
    #SBATCH --partition=main
    #SBATCH --nodes=4
    #SBATCH --ntasks=4
    #SBATCH --ntasks-per-node=1
    #SBATCH --gres=gpu:8
    #SBATCH --cpus-per-task=128
    #SBATCH --mem=1440G
    #SBATCH --output=i2v_output/i2v_%j.out
    #SBATCH --error=i2v_output/i2v_%j.err
    #SBATCH --exclusive
    set -e -x
    
    # Environment Setup
    source ~/conda/miniconda/bin/activate
    conda activate will-fv
    
    # Basic Info
    export WANDB_MODE="online"
    export NCCL_P2P_DISABLE=1
    export TORCH_NCCL_ENABLE_MONITORING=0
    # different cache dir for different processes
    export TRITON_CACHE_DIR=/tmp/triton_cache_${SLURM_PROCID}
    export MASTER_PORT=29500
    export NODE_RANK=$SLURM_PROCID
    nodes=( $(scontrol show hostnames $SLURM_JOB_NODELIST) )
    export MASTER_ADDR=${nodes[0]}
    export CUDA_VISIBLE_DEVICES=$SLURM_LOCALID
    export TOKENIZERS_PARALLELISM=false
    export WANDB_BASE_URL="https://api.wandb.ai"
    export WANDB_MODE=online
    # export FASTVIDEO_ATTENTION_BACKEND=TORCH_SDPA
    
    echo "MASTER_ADDR: $MASTER_ADDR"
    echo "NODE_RANK: $NODE_RANK"
    
    # Configs
    NUM_GPUS=8
    
    MODEL_PATH="Wan-AI/Wan2.1-I2V-14B-480P-Diffusers"
    DATA_DIR="data/crush-smol_processed_i2v/combined_parquet_dataset/"
    VALIDATION_DATASET_FILE="examples/training/finetune/wan_i2v_14b_480p/crush_smol/validation.json"
    # export CUDA_VISIBLE_DEVICES=4,5
    # IP=[MASTER NODE IP]
    
    # If you do not have 32 GPUs and to fit in memory, you can: 1. increase sp_size. 2. reduce num_latent_t
    
    # Training arguments
    training_args=(
      --tracker_project_name wan_i2v_finetune
      --output_dir="checkpoints/wan_i2v_finetune"
      --max_train_steps 2000
      --train_batch_size 2
      --train_sp_batch_size 1
      --gradient_accumulation_steps 1
      --num_latent_t 8
      --num_height 480
      --num_width 832
      --num_frames 77
      --enable_gradient_checkpointing_type "full"
    )
    
    # Parallel arguments
    parallel_args=(
      --num_gpus $NUM_GPUS
      --sp_size $NUM_GPUS
      --tp_size 1
      --hsdp_replicate_dim $SLURM_JOB_NUM_NODES
      --hsdp_shard_dim $NUM_GPUS
    )
    
    # Model arguments
    model_args=(
      --model_path $MODEL_PATH
      --pretrained_model_name_or_path $MODEL_PATH
    )
    
    # Dataset arguments
    dataset_args=(
      --data_path "$DATA_DIR"
      --dataloader_num_workers 10
    )
    
    # Validation arguments
    validation_args=(
      --log_validation
      --validation_dataset_file "$VALIDATION_DATASET_FILE"
      --validation_steps 100
      --validation_sampling_steps "40"
      --validation_guidance_scale "6.0"
    )
    
    # Optimizer arguments
    optimizer_args=(
      --learning_rate 1e-5
      --mixed_precision "bf16"
      --weight_only_checkpointing_steps 1000
      --training_state_checkpointing_steps 1000
      --weight_decay 1e-4
      --max_grad_norm 1.0
    )
    
    # Miscellaneous arguments
    miscellaneous_args=(
      --inference_mode False
      --checkpoints_total_limit 3
      --training_cfg_rate 0.1
      --multi_phased_distill_schedule "4000-1"
      --not_apply_cfg_solver
      --dit_precision "fp32"
      --num_euler_timesteps 50
      --ema_start_step 0
      --enable_gradient_checkpointing_type "full"
    )
    
    srun torchrun \
    --nnodes $SLURM_JOB_NUM_NODES \
    --nproc_per_node $NUM_GPUS \
    --node_rank $SLURM_PROCID \
    --rdzv_backend=c10d \
    --rdzv_endpoint="$MASTER_ADDR:$MASTER_PORT" \
        fastvideo/training/runner.py \
        --pipeline-class WanI2VTrainingPipeline \
        --pipeline-module fastvideo.training.wan_i2v_training_pipeline \
        "${parallel_args[@]}" \
        "${model_args[@]}" \
        "${dataset_args[@]}" \
        "${training_args[@]}" \
        "${optimizer_args[@]}" \
        "${validation_args[@]}" \
        "${miscellaneous_args[@]}"
    ```

??? note "finetune_i2v_lora.sh"

    ```sh
    #!/bin/bash
    
    export WANDB_BASE_URL="https://api.wandb.ai"
    export WANDB_MODE=online
    # export FASTVIDEO_ATTENTION_BACKEND=TORCH_SDPA
    
    MODEL_PATH="Wan-AI/Wan2.1-I2V-14B-480P-Diffusers"
    DATA_DIR="data/crush-smol_processed_i2v/combined_parquet_dataset/"
    VALIDATION_DIR="data/crush-smol_processed_i2v/validation_parquet_dataset/"
    NUM_GPUS=4
    # export CUDA_VISIBLE_DEVICES=4,5
    # IP=[MASTER NODE IP]
    
    # Training arguments
    training_args=(
      --tracker_project_name "wan_i2v_finetune"
      --output_dir "checkpoints/wan_i2v_finetune"
      --max_train_steps 2000
      --train_batch_size 1
      --train_sp_batch_size 1
      --gradient_accumulation_steps 1
      --num_latent_t 8
      --num_height 480
      --num_width 832
      --num_frames 77
      --lora_rank 32
      --lora_training True
    )
    
    # Parallel arguments
    parallel_args=(
      --num_gpus $NUM_GPUS
      --sp_size $NUM_GPUS
      --tp_size $NUM_GPUS
      --hsdp_replicate_dim 1
      --hsdp_shard_dim $NUM_GPUS
    )
    
    # Model arguments
    model_args=(
      --model_path $MODEL_PATH
      --pretrained_model_name_or_path $MODEL_PATH
    )
    
    # Dataset arguments
    dataset_args=(
      --data_path "$DATA_DIR"
      --dataloader_num_workers 1
    )
    
    # Validation arguments
    validation_args=(
      --log_validation
      --validation_preprocessed_path "$VALIDATION_DIR"
      --validation_steps 100
      --validation_sampling_steps "40"
      --validation_guidance_scale "6.0"
    )
    
    # Optimizer arguments
    optimizer_args=(
      --learning_rate 1e-5
      --mixed_precision "bf16"
      --weight_only_checkpointing_steps 1000
      --training_state_checkpointing_steps 1000
      --weight_decay 1e-4
      --max_grad_norm 1.0
    )
    
    # Miscellaneous arguments
    miscellaneous_args=(
      --inference_mode False
      --checkpoints_total_limit 3
      --training_cfg_rate 0.1
      --multi_phased_distill_schedule "4000-1"
      --not_apply_cfg_solver
      --dit_precision "fp32"
      --num_euler_timesteps 50
      --ema_start_step 0
    )
    
    # If you do not have 32 GPUs and to fit in memory, you can: 1. increase sp_size. 2. reduce num_latent_t
    torchrun \
      --nnodes 1 \
      --nproc_per_node $NUM_GPUS \
        fastvideo/training/runner.py \
        --pipeline-class WanI2VTrainingPipeline \
        --pipeline-module fastvideo.training.wan_i2v_training_pipeline \
        "${parallel_args[@]}" \
        "${model_args[@]}" \
        "${dataset_args[@]}" \
        "${training_args[@]}" \
        "${optimizer_args[@]}" \
        "${validation_args[@]}" \
        "${miscellaneous_args[@]}"
    
    ```

??? note "preprocess_wan_data_i2v.sh"

    ```sh
    #!/bin/bash
    
    GPU_NUM=1 # 2,4,8
    MODEL_PATH="Wan-AI/Wan2.1-I2V-14B-480P-Diffusers"
    MODEL_TYPE="wan"
    DATA_MERGE_PATH="data/crush-smol/merge.txt"
    OUTPUT_DIR="data/crush-smol_processed_i2v/"
    
    torchrun --nproc_per_node=$GPU_NUM \
        fastvideo/pipelines/preprocess/v1_preprocess.py \
        --model_path $MODEL_PATH \
        --data_merge_path $DATA_MERGE_PATH \
        --preprocess_video_batch_size 8 \
        --seed 42 \
        --max_height 480 \
        --max_width 832 \
        --num_frames 77 \
        --dataloader_num_workers 0 \
        --output_dir=$OUTPUT_DIR \
        --train_fps 16 \
        --samples_per_file 8 \
        --flush_frequency 8 \
        --video_length_tolerance_range 5 \
        --preprocess_task "i2v" 
    ```

??? note "preprocess_wan_data_i2v_new.sh"

    ```sh
    #!/bin/bash
    
    GPU_NUM=2 # 2,4,8
    MODEL_PATH="Wan-AI/Wan2.1-I2V-14B-480P-Diffusers"
    DATASET_PATH="data/crush-smol/"
    OUTPUT_DIR="data/crush-smol_processed_i2v/"
    
    torchrun --nproc_per_node=$GPU_NUM \
        -m fastvideo.pipelines.preprocess.v1_preprocessing_new \
        --model_path $MODEL_PATH \
        --mode preprocess \
        --workload_type i2v \
        --preprocess.dataset_type merged \
        --preprocess.dataset_path $DATASET_PATH \
        --preprocess.dataset_output_dir $OUTPUT_DIR \
        --preprocess.preprocess_video_batch_size 2 \
        --preprocess.dataloader_num_workers 0 \
        --preprocess.max_height 480 \
        --preprocess.max_width 832 \
        --preprocess.num_frames 77 \
        --preprocess.train_fps 16 \
        --preprocess.samples_per_file 8 \
        --preprocess.flush_frequency 8 \
        --preprocess.video_length_tolerance_range 5
    
    ```

??? note "validation.json"

    ```json
    {
      "data": [
        {
          "caption": "A large metal cylinder is seen pressing down on a pile of Oreo cookies, flattening them as if they were under a hydraulic press.",
          "image_path": null,
          "video_path": "validation_dataset/yYcK4nANZz4-Scene-034.mp4",
          "num_inference_steps": 40,
          "height": 480,
          "width": 832,
          "num_frames": 77
        },
        {
          "caption": "A large metal cylinder is seen compressing colorful clay into a compact shape, demonstrating the power of a hydraulic press.",
          "image_path": null,
          "video_path": "validation_dataset/yYcK4nANZz4-Scene-027.mp4",
          "num_inference_steps": 40,
          "height": 480,
          "width": 832,
          "num_frames": 77
        },
        {
          "caption": "A large metal cylinder is seen pressing down on a pile of colorful candies, flattening them as if they were under a hydraulic press. The candies are crushed and broken into small pieces, creating a mess on the table.",
          "image_path": null,
          "video_path": "validation_dataset/yYcK4nANZz4-Scene-030.mp4",
          "num_inference_steps": 40,
          "height": 480,
          "width": 832,
          "num_frames": 77
        }
      ]
    }
    ```


