Move DeMemWM multiview launchers to debug scripts
Browse files- .debug_scripts/train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_2h200_debug.sh +148 -0
- .debug_scripts/train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_full.sh +144 -0
- train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_2h200_debug.sh +0 -101
- train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_full.sh +0 -105
.debug_scripts/train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_2h200_debug.sh
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
#SBATCH --job-name=dmwm-mview-debug
|
| 3 |
+
#SBATCH --nodes=1
|
| 4 |
+
#SBATCH --ntasks-per-node=2
|
| 5 |
+
#SBATCH --gres=gpu:2
|
| 6 |
+
#SBATCH --cpus-per-task=8
|
| 7 |
+
#SBATCH --mem=256G
|
| 8 |
+
#SBATCH --time=02:00:00
|
| 9 |
+
#SBATCH --partition=gpu
|
| 10 |
+
#SBATCH --output=slurm_logs/dmwm-mview-debug-%j.out
|
| 11 |
+
#SBATCH --error=slurm_logs/dmwm-mview-debug-%j.out
|
| 12 |
+
#SBATCH --chdir=/share_1/users/bonan_ding/WorldMem
|
| 13 |
+
|
| 14 |
+
set -eo pipefail
|
| 15 |
+
|
| 16 |
+
REPO=/share_1/users/bonan_ding/WorldMem
|
| 17 |
+
PYTHON_BIN=/share_1/users/bonan_ding/.conda/envs/worldmem/bin/python
|
| 18 |
+
LOCAL_OASIS=/share_1/users/bonan_ding/worldmem_ckpt/open-oasis-ckpts/oasis500m.safetensors
|
| 19 |
+
LOCAL_VAE=/share_1/users/bonan_ding/worldmem_ckpt/open-oasis-ckpts/vit-l-20.safetensors
|
| 20 |
+
LOCAL_DATA=/share_1/users/bonan_ding/worldmem_data/minecraft
|
| 21 |
+
LOCAL_FEATURES=/share_1/users/bonan_ding/worldmem_data/minecraft/vae_features
|
| 22 |
+
|
| 23 |
+
RUN_NAME=train_dememwm_curric_multiview_anchorclean_causal_cleanmem_debug_${SLURM_JOB_ID:-manual}
|
| 24 |
+
OUTPUT_DIR=${REPO}/outputs/${RUN_NAME}
|
| 25 |
+
LOG_PREFIX="[DEMEMWM_MULTIVIEW_DEBUG]"
|
| 26 |
+
CURRICULUM='{enabled:true,stages:[{name:no_updown,until_step:4,dataset:{wo_updown:true}},{name:with_updown,until_step:8,dataset:{wo_updown:false}}]}'
|
| 27 |
+
|
| 28 |
+
export PYTHONPATH="${REPO}:${PYTHONPATH:-}"
|
| 29 |
+
export HF_HOME=/share_1/users/bonan_ding/.tmp/cache/huggingface
|
| 30 |
+
export TORCH_HOME=/share_1/users/bonan_ding/.tmp/cache/torch
|
| 31 |
+
export PIP_CACHE_DIR=/share_1/users/bonan_ding/.tmp/cache/pip
|
| 32 |
+
export XDG_CACHE_HOME=/share_1/users/bonan_ding/.tmp/cache/xdg
|
| 33 |
+
export TRITON_CACHE_DIR=/share_1/users/bonan_ding/.tmp/cache/triton
|
| 34 |
+
export TMPDIR=/share_1/users/bonan_ding/.tmp
|
| 35 |
+
export WANDB_MODE=offline
|
| 36 |
+
export WANDB_DISABLED=false
|
| 37 |
+
export TOKENIZERS_PARALLELISM=false
|
| 38 |
+
export HYDRA_FULL_ERROR=1
|
| 39 |
+
export NCCL_P2P_DISABLE=1
|
| 40 |
+
export CUDA_VISIBLE_DEVICES=0,1
|
| 41 |
+
export PYTHONUNBUFFERED=1
|
| 42 |
+
|
| 43 |
+
mkdir -p "${OUTPUT_DIR}" slurm_logs \
|
| 44 |
+
"${HF_HOME}" "${TORCH_HOME}" "${PIP_CACHE_DIR}" "${XDG_CACHE_HOME}" "${TRITON_CACHE_DIR}"
|
| 45 |
+
|
| 46 |
+
cd "${REPO}"
|
| 47 |
+
if [[ ! -s "${LOCAL_OASIS}" ]]; then
|
| 48 |
+
echo "${LOG_PREFIX}[ERROR] missing diffusion checkpoint: ${LOCAL_OASIS}" >&2
|
| 49 |
+
exit 2
|
| 50 |
+
fi
|
| 51 |
+
if [[ ! -s "${LOCAL_VAE}" ]]; then
|
| 52 |
+
echo "${LOG_PREFIX}[ERROR] missing VAE checkpoint: ${LOCAL_VAE}" >&2
|
| 53 |
+
exit 2
|
| 54 |
+
fi
|
| 55 |
+
if ! find "${LOCAL_DATA}/training" -type f -name '*.mp4' -print -quit 2>/dev/null | grep -q .; then
|
| 56 |
+
echo "${LOG_PREFIX}[ERROR] missing raw training mp4s under ${LOCAL_DATA}/training" >&2
|
| 57 |
+
exit 2
|
| 58 |
+
fi
|
| 59 |
+
if ! find "${LOCAL_DATA}/validation" -type f -name '*.mp4' -print -quit 2>/dev/null | grep -q .; then
|
| 60 |
+
echo "${LOG_PREFIX}[ERROR] missing raw validation mp4s under ${LOCAL_DATA}/validation" >&2
|
| 61 |
+
exit 2
|
| 62 |
+
fi
|
| 63 |
+
if ! find "${LOCAL_FEATURES}/training" -type f -name '*_vae_feature.npy' -print -quit 2>/dev/null | grep -q .; then
|
| 64 |
+
echo "${LOG_PREFIX}[ERROR] missing training VAE feature cache under ${LOCAL_FEATURES}/training" >&2
|
| 65 |
+
exit 2
|
| 66 |
+
fi
|
| 67 |
+
if ! find "${LOCAL_FEATURES}/validation" -type f -name '*_vae_feature.npy' -print -quit 2>/dev/null | grep -q .; then
|
| 68 |
+
echo "${LOG_PREFIX}[ERROR] missing validation VAE feature cache under ${LOCAL_FEATURES}/validation" >&2
|
| 69 |
+
exit 2
|
| 70 |
+
fi
|
| 71 |
+
|
| 72 |
+
echo "${LOG_PREFIX} repo=${REPO} output=${OUTPUT_DIR} partition=${SLURM_JOB_PARTITION:-local} job=${SLURM_JOB_ID:-manual}"
|
| 73 |
+
echo "${LOG_PREFIX} branch=$(git branch --show-current || true) commit=$(git rev-parse --short HEAD || true)"
|
| 74 |
+
echo "${LOG_PREFIX} status=$(git status --short | tr '\n' ';' || true)"
|
| 75 |
+
echo "${LOG_PREFIX} run_name=${RUN_NAME} wandb_mode=${WANDB_MODE} batch_size_per_gpu=8 global_batch=16"
|
| 76 |
+
echo "${LOG_PREFIX} curriculum=no_updown_until_4_then_with_updown_until_8"
|
| 77 |
+
echo "${LOG_PREFIX} memory_selection=causal_true dynamic_policy=multiview selector=fov_greedy clean_memory"
|
| 78 |
+
echo "${LOG_PREFIX} validation=n_frames_valid_700 context_frames_600 generated_frames_100 limit_batch_1"
|
| 79 |
+
echo "${LOG_PREFIX} data=${LOCAL_DATA} features=${LOCAL_FEATURES}"
|
| 80 |
+
nvidia-smi || true
|
| 81 |
+
wandb offline >/dev/null 2>&1 || true
|
| 82 |
+
|
| 83 |
+
srun "${PYTHON_BIN}" -m main \
|
| 84 |
+
+name="${RUN_NAME}" \
|
| 85 |
+
+output_dir="${OUTPUT_DIR}/" \
|
| 86 |
+
auto_resume=false \
|
| 87 |
+
wandb.mode=offline \
|
| 88 |
+
"experiment.tasks=[training]" \
|
| 89 |
+
experiment.num_nodes=1 \
|
| 90 |
+
algorithm=dememwm_base \
|
| 91 |
+
+customized_load=true \
|
| 92 |
+
+seperate_load=true \
|
| 93 |
+
+diffusion_model_path="${LOCAL_OASIS}" \
|
| 94 |
+
+vae_path="${LOCAL_VAE}" \
|
| 95 |
+
dataset=video_minecraft_dememwm_latent \
|
| 96 |
+
dataset.save_dir="${LOCAL_DATA}" \
|
| 97 |
+
dataset.precomputed_feature_dir="${LOCAL_FEATURES}" \
|
| 98 |
+
dataset.n_frames=8 \
|
| 99 |
+
dataset.n_frames_valid=700 \
|
| 100 |
+
dataset.context_length=100 \
|
| 101 |
+
dataset.single_eval_clip=true \
|
| 102 |
+
dataset.memory_selection.enabled=true \
|
| 103 |
+
dataset.memory_selection.causal=true \
|
| 104 |
+
dataset.memory_selection.max_anchor_frames=2 \
|
| 105 |
+
dataset.memory_selection.max_dynamic_frames=4 \
|
| 106 |
+
dataset.memory_selection.max_revisit_frames=2 \
|
| 107 |
+
dataset.memory_selection.pose_similarity_threshold=0.6 \
|
| 108 |
+
dataset.memory_selection.training_use_plucker=true \
|
| 109 |
+
dataset.memory_selection.training_plucker_weight=1.0 \
|
| 110 |
+
dataset.memory_selection.fov_overlap_threshold=0.6 \
|
| 111 |
+
dataset.memory_selection.min_total_selected_coverage=0.1 \
|
| 112 |
+
dataset.memory_selection.local_context_exclusion_frames=8 \
|
| 113 |
+
dataset.memory_selection.anchor_diverse_selection=true \
|
| 114 |
+
+dataset.memory_selection.pose_preselect_topk=32 \
|
| 115 |
+
+dataset.memory_selection.candidate_chunk_size=0 \
|
| 116 |
+
dataset.memory_selection.dynamic.selection_policy=multiview \
|
| 117 |
+
dataset.memory_selection.dynamic.multiview_selector=fov_greedy \
|
| 118 |
+
algorithm.causal=true \
|
| 119 |
+
algorithm.n_tokens=8 \
|
| 120 |
+
algorithm.context_frames=600 \
|
| 121 |
+
algorithm.metric_report_segment=100 \
|
| 122 |
+
algorithm.chunk_size=1 \
|
| 123 |
+
algorithm.warmup_steps=4 \
|
| 124 |
+
algorithm.trainability.train_full_dit=true \
|
| 125 |
+
algorithm.trainability.full_dit_start_step=4 \
|
| 126 |
+
algorithm.trainability.lr.memory_modules=4.0e-5 \
|
| 127 |
+
algorithm.trainability.lr.base_dit=1.0e-5 \
|
| 128 |
+
algorithm.log_video=true \
|
| 129 |
+
algorithm.save_local=true \
|
| 130 |
+
algorithm.diffusion.sampling_timesteps=20 \
|
| 131 |
+
algorithm.noise_route.anchor=all \
|
| 132 |
+
algorithm.noise_route.dynamic=all \
|
| 133 |
+
algorithm.noise_route.revisit=all \
|
| 134 |
+
algorithm.memory_noise.enabled=false \
|
| 135 |
+
algorithm.memory_noise.anchor_max_fraction=0.0 \
|
| 136 |
+
algorithm.memory_noise.dynamic_max_fraction=0.0 \
|
| 137 |
+
algorithm.memory_noise.revisit_max_fraction=0.0 \
|
| 138 |
+
+algorithm.memory_noise.validation_noisy_memory=false \
|
| 139 |
+
"experiment.training.curriculum=${CURRICULUM}" \
|
| 140 |
+
experiment.training.batch_size=8 \
|
| 141 |
+
experiment.training.optim.accumulate_grad_batches=1 \
|
| 142 |
+
experiment.validation.batch_size=1 \
|
| 143 |
+
experiment.validation.limit_batch=1 \
|
| 144 |
+
experiment.validation.data.num_workers=2 \
|
| 145 |
+
experiment.validation.inference_mode=false \
|
| 146 |
+
experiment.training.checkpointing.every_n_train_steps=4 \
|
| 147 |
+
experiment.validation.val_every_n_step=4 \
|
| 148 |
+
experiment.training.max_steps=8
|
.debug_scripts/train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_full.sh
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
#SBATCH --job-name=dmwm-mview-clean-2h200
|
| 3 |
+
#SBATCH --nodes=1
|
| 4 |
+
#SBATCH --ntasks-per-node=2
|
| 5 |
+
#SBATCH --gres=gpu:2
|
| 6 |
+
#SBATCH --cpus-per-task=8
|
| 7 |
+
#SBATCH --mem=256G
|
| 8 |
+
#SBATCH --time=72:00:00
|
| 9 |
+
#SBATCH --partition=gpu
|
| 10 |
+
#SBATCH --output=slurm_logs/dmwm-mview-clean-2h200-%j.out
|
| 11 |
+
#SBATCH --error=slurm_logs/dmwm-mview-clean-2h200-%j.out
|
| 12 |
+
#SBATCH --chdir=/share_1/users/bonan_ding/WorldMem
|
| 13 |
+
|
| 14 |
+
set -eo pipefail
|
| 15 |
+
|
| 16 |
+
REPO=/share_1/users/bonan_ding/WorldMem
|
| 17 |
+
PYTHON_BIN=/share_1/users/bonan_ding/.conda/envs/worldmem/bin/python
|
| 18 |
+
LOCAL_OASIS=/share_1/users/bonan_ding/worldmem_ckpt/open-oasis-ckpts/oasis500m.safetensors
|
| 19 |
+
LOCAL_VAE=/share_1/users/bonan_ding/worldmem_ckpt/open-oasis-ckpts/vit-l-20.safetensors
|
| 20 |
+
LOCAL_DATA=/share_1/users/bonan_ding/worldmem_data/minecraft
|
| 21 |
+
LOCAL_FEATURES=/share_1/users/bonan_ding/worldmem_data/minecraft/vae_features
|
| 22 |
+
|
| 23 |
+
RUN_NAME=train_dememwm_curric_multiview_anchorclean_causal_cleanmem_fovgreedy_a2d4r2_route_ntok8_2h200_bs8_global16_400k
|
| 24 |
+
OUTPUT_DIR=${REPO}/outputs/${RUN_NAME}
|
| 25 |
+
LOG_PREFIX="[DEMEMWM_MULTIVIEW_CLEAN_2H200]"
|
| 26 |
+
CURRICULUM='{enabled:true,stages:[{name:no_updown,until_step:120000,dataset:{wo_updown:true}},{name:with_updown,until_step:400000,dataset:{wo_updown:false}}]}'
|
| 27 |
+
|
| 28 |
+
export PYTHONPATH="${REPO}:${PYTHONPATH:-}"
|
| 29 |
+
export HF_HOME=/share_1/users/bonan_ding/.tmp/cache/huggingface
|
| 30 |
+
export TORCH_HOME=/share_1/users/bonan_ding/.tmp/cache/torch
|
| 31 |
+
export PIP_CACHE_DIR=/share_1/users/bonan_ding/.tmp/cache/pip
|
| 32 |
+
export XDG_CACHE_HOME=/share_1/users/bonan_ding/.tmp/cache/xdg
|
| 33 |
+
export TRITON_CACHE_DIR=/share_1/users/bonan_ding/.tmp/cache/triton
|
| 34 |
+
export TMPDIR=/share_1/users/bonan_ding/.tmp
|
| 35 |
+
export WANDB_MODE=online
|
| 36 |
+
export WANDB_DISABLED=false
|
| 37 |
+
export TOKENIZERS_PARALLELISM=false
|
| 38 |
+
export HYDRA_FULL_ERROR=1
|
| 39 |
+
export NCCL_P2P_DISABLE=1
|
| 40 |
+
export CUDA_VISIBLE_DEVICES=0,1
|
| 41 |
+
export PYTHONUNBUFFERED=1
|
| 42 |
+
|
| 43 |
+
mkdir -p "${OUTPUT_DIR}" slurm_logs \
|
| 44 |
+
"${HF_HOME}" "${TORCH_HOME}" "${PIP_CACHE_DIR}" "${XDG_CACHE_HOME}" "${TRITON_CACHE_DIR}"
|
| 45 |
+
|
| 46 |
+
cd "${REPO}"
|
| 47 |
+
if [[ ! -s "${LOCAL_OASIS}" ]]; then
|
| 48 |
+
echo "${LOG_PREFIX}[ERROR] missing diffusion checkpoint: ${LOCAL_OASIS}" >&2
|
| 49 |
+
exit 2
|
| 50 |
+
fi
|
| 51 |
+
if [[ ! -s "${LOCAL_VAE}" ]]; then
|
| 52 |
+
echo "${LOG_PREFIX}[ERROR] missing VAE checkpoint: ${LOCAL_VAE}" >&2
|
| 53 |
+
exit 2
|
| 54 |
+
fi
|
| 55 |
+
if ! find "${LOCAL_DATA}/training" -type f -name '*.mp4' -print -quit 2>/dev/null | grep -q .; then
|
| 56 |
+
echo "${LOG_PREFIX}[ERROR] missing raw training mp4s under ${LOCAL_DATA}/training" >&2
|
| 57 |
+
exit 2
|
| 58 |
+
fi
|
| 59 |
+
if ! find "${LOCAL_DATA}/validation" -type f -name '*.mp4' -print -quit 2>/dev/null | grep -q .; then
|
| 60 |
+
echo "${LOG_PREFIX}[ERROR] missing raw validation mp4s under ${LOCAL_DATA}/validation" >&2
|
| 61 |
+
exit 2
|
| 62 |
+
fi
|
| 63 |
+
if ! find "${LOCAL_FEATURES}/training" -type f -name '*_vae_feature.npy' -print -quit 2>/dev/null | grep -q .; then
|
| 64 |
+
echo "${LOG_PREFIX}[ERROR] missing training VAE feature cache under ${LOCAL_FEATURES}/training" >&2
|
| 65 |
+
exit 2
|
| 66 |
+
fi
|
| 67 |
+
if ! find "${LOCAL_FEATURES}/validation" -type f -name '*_vae_feature.npy' -print -quit 2>/dev/null | grep -q .; then
|
| 68 |
+
echo "${LOG_PREFIX}[ERROR] missing validation VAE feature cache under ${LOCAL_FEATURES}/validation" >&2
|
| 69 |
+
exit 2
|
| 70 |
+
fi
|
| 71 |
+
|
| 72 |
+
echo "${LOG_PREFIX} repo=${REPO} output=${OUTPUT_DIR} partition=${SLURM_JOB_PARTITION:-local} job=${SLURM_JOB_ID:-manual}"
|
| 73 |
+
echo "${LOG_PREFIX} branch=$(git branch --show-current || true) commit=$(git rev-parse --short HEAD || true)"
|
| 74 |
+
echo "${LOG_PREFIX} status=$(git status --short | tr '\n' ';' || true)"
|
| 75 |
+
echo "${LOG_PREFIX} run_name=${RUN_NAME} wandb_mode=${WANDB_MODE} batch_size_per_gpu=8 global_batch=16"
|
| 76 |
+
echo "${LOG_PREFIX} curriculum=no_updown_until_120000_then_with_updown_until_400000"
|
| 77 |
+
echo "${LOG_PREFIX} memory_selection=causal_true dynamic_policy=multiview selector=fov_greedy clean_memory"
|
| 78 |
+
echo "${LOG_PREFIX} data=${LOCAL_DATA} features=${LOCAL_FEATURES}"
|
| 79 |
+
nvidia-smi || true
|
| 80 |
+
|
| 81 |
+
srun "${PYTHON_BIN}" -m main \
|
| 82 |
+
+name="${RUN_NAME}" \
|
| 83 |
+
+output_dir="${OUTPUT_DIR}/" \
|
| 84 |
+
auto_resume=true \
|
| 85 |
+
wandb.mode=online \
|
| 86 |
+
"experiment.tasks=[training]" \
|
| 87 |
+
experiment.num_nodes=1 \
|
| 88 |
+
algorithm=dememwm_base \
|
| 89 |
+
+customized_load=true \
|
| 90 |
+
+seperate_load=true \
|
| 91 |
+
+diffusion_model_path="${LOCAL_OASIS}" \
|
| 92 |
+
+vae_path="${LOCAL_VAE}" \
|
| 93 |
+
dataset=video_minecraft_dememwm_latent \
|
| 94 |
+
dataset.save_dir="${LOCAL_DATA}" \
|
| 95 |
+
dataset.precomputed_feature_dir="${LOCAL_FEATURES}" \
|
| 96 |
+
dataset.n_frames=8 \
|
| 97 |
+
dataset.n_frames_valid=1100 \
|
| 98 |
+
dataset.context_length=100 \
|
| 99 |
+
dataset.single_eval_clip=true \
|
| 100 |
+
dataset.memory_selection.enabled=true \
|
| 101 |
+
dataset.memory_selection.causal=true \
|
| 102 |
+
dataset.memory_selection.max_anchor_frames=2 \
|
| 103 |
+
dataset.memory_selection.max_dynamic_frames=4 \
|
| 104 |
+
dataset.memory_selection.max_revisit_frames=2 \
|
| 105 |
+
dataset.memory_selection.pose_similarity_threshold=0.6 \
|
| 106 |
+
dataset.memory_selection.training_use_plucker=true \
|
| 107 |
+
dataset.memory_selection.training_plucker_weight=1.0 \
|
| 108 |
+
dataset.memory_selection.fov_overlap_threshold=0.6 \
|
| 109 |
+
dataset.memory_selection.min_total_selected_coverage=0.1 \
|
| 110 |
+
dataset.memory_selection.local_context_exclusion_frames=8 \
|
| 111 |
+
dataset.memory_selection.anchor_diverse_selection=true \
|
| 112 |
+
+dataset.memory_selection.pose_preselect_topk=64 \
|
| 113 |
+
+dataset.memory_selection.candidate_chunk_size=64 \
|
| 114 |
+
dataset.memory_selection.dynamic.selection_policy=multiview \
|
| 115 |
+
dataset.memory_selection.dynamic.multiview_selector=fov_greedy \
|
| 116 |
+
algorithm.causal=true \
|
| 117 |
+
algorithm.n_tokens=8 \
|
| 118 |
+
algorithm.context_frames=600 \
|
| 119 |
+
algorithm.metric_report_segment=100 \
|
| 120 |
+
algorithm.chunk_size=1 \
|
| 121 |
+
algorithm.warmup_steps=10000 \
|
| 122 |
+
algorithm.trainability.train_full_dit=true \
|
| 123 |
+
algorithm.trainability.full_dit_start_step=40000 \
|
| 124 |
+
algorithm.trainability.lr.memory_modules=4.0e-5 \
|
| 125 |
+
algorithm.trainability.lr.base_dit=1.0e-5 \
|
| 126 |
+
algorithm.log_video=true \
|
| 127 |
+
algorithm.save_local=true \
|
| 128 |
+
algorithm.diffusion.sampling_timesteps=20 \
|
| 129 |
+
algorithm.noise_route.anchor=all \
|
| 130 |
+
algorithm.noise_route.dynamic=all \
|
| 131 |
+
algorithm.noise_route.revisit=all \
|
| 132 |
+
algorithm.memory_noise.enabled=false \
|
| 133 |
+
algorithm.memory_noise.anchor_max_fraction=0.0 \
|
| 134 |
+
algorithm.memory_noise.dynamic_max_fraction=0.0 \
|
| 135 |
+
algorithm.memory_noise.revisit_max_fraction=0.0 \
|
| 136 |
+
+algorithm.memory_noise.validation_noisy_memory=false \
|
| 137 |
+
"experiment.training.curriculum=${CURRICULUM}" \
|
| 138 |
+
experiment.training.batch_size=8 \
|
| 139 |
+
experiment.training.optim.accumulate_grad_batches=1 \
|
| 140 |
+
experiment.validation.batch_size=1 \
|
| 141 |
+
experiment.validation.limit_batch=4 \
|
| 142 |
+
experiment.training.checkpointing.every_n_train_steps=5000 \
|
| 143 |
+
experiment.validation.val_every_n_step=5000 \
|
| 144 |
+
experiment.training.max_steps=400000
|
train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_2h200_debug.sh
DELETED
|
@@ -1,101 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env bash
|
| 2 |
-
set -euo pipefail
|
| 3 |
-
|
| 4 |
-
export PYTHONPATH="./:${PYTHONPATH:-}"
|
| 5 |
-
export HYDRA_FULL_ERROR=1
|
| 6 |
-
export CUDA_VISIBLE_DEVICES=${CUDA_VISIBLE_DEVICES:-0,1}
|
| 7 |
-
|
| 8 |
-
NPROC_PER_NODE=${NPROC_PER_NODE:-2}
|
| 9 |
-
DATA_ROOT=${DATA_ROOT:-data/minecraft_simple_backforward}
|
| 10 |
-
FEATURE_ROOT=${FEATURE_ROOT:-${DATA_ROOT}/vae_features}
|
| 11 |
-
OUTPUT_ROOT=${OUTPUT_ROOT:-outputs}
|
| 12 |
-
RUN_NAME=${RUN_NAME:-train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_2h200_debug}
|
| 13 |
-
OUTPUT_DIR=${OUTPUT_DIR:-${OUTPUT_ROOT}/${RUN_NAME}}
|
| 14 |
-
|
| 15 |
-
: "${DIFFUSION_MODEL_PATH:?Set DIFFUSION_MODEL_PATH to a local diffusion checkpoint}"
|
| 16 |
-
: "${VAE_PATH:?Set VAE_PATH to a local VAE checkpoint}"
|
| 17 |
-
|
| 18 |
-
MAX_STEPS=${MAX_STEPS:-50}
|
| 19 |
-
VAL_EVERY_N_STEP=${VAL_EVERY_N_STEP:-25}
|
| 20 |
-
CHECKPOINT_EVERY_N_STEPS=${CHECKPOINT_EVERY_N_STEPS:-25}
|
| 21 |
-
LIMIT_BATCH=${LIMIT_BATCH:-1}
|
| 22 |
-
N_FRAMES_VALID=${N_FRAMES_VALID:-128}
|
| 23 |
-
CONTEXT_LENGTH=${CONTEXT_LENGTH:-100}
|
| 24 |
-
ALGORITHM_CONTEXT_FRAMES=${ALGORITHM_CONTEXT_FRAMES:-100}
|
| 25 |
-
TRAIN_BATCH_SIZE=${TRAIN_BATCH_SIZE:-1}
|
| 26 |
-
VAL_BATCH_SIZE=${VAL_BATCH_SIZE:-1}
|
| 27 |
-
NUM_WORKERS=${NUM_WORKERS:-2}
|
| 28 |
-
CURRICULUM_NO_UPDOWN_UNTIL_STEP=${CURRICULUM_NO_UPDOWN_UNTIL_STEP:-25}
|
| 29 |
-
CURRICULUM="{enabled:true,stages:[{name:no_updown,until_step:${CURRICULUM_NO_UPDOWN_UNTIL_STEP},dataset:{wo_updown:true}},{name:with_updown,until_step:${MAX_STEPS},dataset:{wo_updown:false}}]}"
|
| 30 |
-
|
| 31 |
-
mkdir -p "${OUTPUT_DIR}"
|
| 32 |
-
|
| 33 |
-
torchrun --standalone --nproc_per_node=${NPROC_PER_NODE} -m main \
|
| 34 |
-
"+name=${RUN_NAME}" \
|
| 35 |
-
"+output_dir=${OUTPUT_DIR}/" \
|
| 36 |
-
auto_resume=false \
|
| 37 |
-
wandb.mode=offline \
|
| 38 |
-
"experiment.tasks=[training]" \
|
| 39 |
-
algorithm=dememwm_base \
|
| 40 |
-
+customized_load=true \
|
| 41 |
-
+seperate_load=true \
|
| 42 |
-
"+diffusion_model_path=${DIFFUSION_MODEL_PATH}" \
|
| 43 |
-
"+vae_path=${VAE_PATH}" \
|
| 44 |
-
dataset=video_minecraft_dememwm_latent \
|
| 45 |
-
"dataset.save_dir=${DATA_ROOT}" \
|
| 46 |
-
"dataset.precomputed_feature_dir=${FEATURE_ROOT}" \
|
| 47 |
-
dataset.n_frames=8 \
|
| 48 |
-
"dataset.n_frames_valid=${N_FRAMES_VALID}" \
|
| 49 |
-
"dataset.context_length=${CONTEXT_LENGTH}" \
|
| 50 |
-
dataset.single_eval_clip=true \
|
| 51 |
-
dataset.memory_selection.enabled=true \
|
| 52 |
-
dataset.memory_selection.max_anchor_frames=2 \
|
| 53 |
-
dataset.memory_selection.max_dynamic_frames=4 \
|
| 54 |
-
dataset.memory_selection.max_revisit_frames=2 \
|
| 55 |
-
dataset.memory_selection.causal=true \
|
| 56 |
-
dataset.memory_selection.dynamic.selection_policy=multiview \
|
| 57 |
-
dataset.memory_selection.dynamic.multiview_selector=fov_greedy \
|
| 58 |
-
dataset.memory_selection.pose_similarity_threshold=0.6 \
|
| 59 |
-
dataset.memory_selection.training_use_plucker=true \
|
| 60 |
-
dataset.memory_selection.training_plucker_weight=1.0 \
|
| 61 |
-
dataset.memory_selection.fov_overlap_threshold=0.6 \
|
| 62 |
-
dataset.memory_selection.min_total_selected_coverage=0.1 \
|
| 63 |
-
dataset.memory_selection.local_context_exclusion_frames=8 \
|
| 64 |
-
dataset.memory_selection.anchor_diverse_selection=true \
|
| 65 |
-
dataset.memory_selection.pose_preselect_topk=16 \
|
| 66 |
-
dataset.memory_selection.candidate_chunk_size=16 \
|
| 67 |
-
algorithm.causal=true \
|
| 68 |
-
algorithm.n_tokens=8 \
|
| 69 |
-
"algorithm.context_frames=${ALGORITHM_CONTEXT_FRAMES}" \
|
| 70 |
-
algorithm.metric_report_segment=0 \
|
| 71 |
-
+algorithm.log_per_frame_metrics=false \
|
| 72 |
-
algorithm.chunk_size=1 \
|
| 73 |
-
algorithm.warmup_steps=100 \
|
| 74 |
-
algorithm.trainability.train_full_dit=true \
|
| 75 |
-
algorithm.trainability.full_dit_start_step=25 \
|
| 76 |
-
algorithm.trainability.lr.memory_modules=4.0e-5 \
|
| 77 |
-
algorithm.trainability.lr.base_dit=1.0e-5 \
|
| 78 |
-
algorithm.log_video=false \
|
| 79 |
-
algorithm.save_local=true \
|
| 80 |
-
algorithm.diffusion.sampling_timesteps=20 \
|
| 81 |
-
algorithm.noise_route.anchor=all \
|
| 82 |
-
algorithm.noise_route.dynamic=all \
|
| 83 |
-
algorithm.noise_route.revisit=all \
|
| 84 |
-
algorithm.memory_noise.enabled=false \
|
| 85 |
-
algorithm.memory_noise.anchor_max_fraction=0.0 \
|
| 86 |
-
algorithm.memory_noise.dynamic_max_fraction=0.0 \
|
| 87 |
-
algorithm.memory_noise.revisit_max_fraction=0.0 \
|
| 88 |
-
+algorithm.memory_noise.validation_noisy_memory=false \
|
| 89 |
-
"experiment.training.curriculum=${CURRICULUM}" \
|
| 90 |
-
"experiment.training.batch_size=${TRAIN_BATCH_SIZE}" \
|
| 91 |
-
experiment.training.precision=16-mixed \
|
| 92 |
-
experiment.training.optim.accumulate_grad_batches=1 \
|
| 93 |
-
experiment.training.optim.gradient_clip_val=1.0 \
|
| 94 |
-
"experiment.training.data.num_workers=${NUM_WORKERS}" \
|
| 95 |
-
"experiment.validation.data.num_workers=${NUM_WORKERS}" \
|
| 96 |
-
"experiment.validation.batch_size=${VAL_BATCH_SIZE}" \
|
| 97 |
-
"experiment.validation.limit_batch=${LIMIT_BATCH}" \
|
| 98 |
-
"experiment.validation.val_every_n_step=${VAL_EVERY_N_STEP}" \
|
| 99 |
-
"experiment.training.checkpointing.every_n_train_steps=${CHECKPOINT_EVERY_N_STEPS}" \
|
| 100 |
-
experiment.training.checkpointing.save_last_k=2 \
|
| 101 |
-
"experiment.training.max_steps=${MAX_STEPS}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_full.sh
DELETED
|
@@ -1,105 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env bash
|
| 2 |
-
set -euo pipefail
|
| 3 |
-
|
| 4 |
-
export PYTHONPATH="./:${PYTHONPATH:-}"
|
| 5 |
-
export HYDRA_FULL_ERROR=1
|
| 6 |
-
export CUDA_VISIBLE_DEVICES=${CUDA_VISIBLE_DEVICES:-0,1}
|
| 7 |
-
|
| 8 |
-
NPROC_PER_NODE=${NPROC_PER_NODE:-2}
|
| 9 |
-
DATA_ROOT=${DATA_ROOT:-data/minecraft_simple_backforward}
|
| 10 |
-
FEATURE_ROOT=${FEATURE_ROOT:-${DATA_ROOT}/vae_features}
|
| 11 |
-
OUTPUT_ROOT=${OUTPUT_ROOT:-outputs}
|
| 12 |
-
RUN_NAME=${RUN_NAME:-train_dememwm_curric_multiview_anchorclean_causal_cleanmem_local_full}
|
| 13 |
-
OUTPUT_DIR=${OUTPUT_DIR:-${OUTPUT_ROOT}/${RUN_NAME}}
|
| 14 |
-
|
| 15 |
-
: "${DIFFUSION_MODEL_PATH:?Set DIFFUSION_MODEL_PATH to a local diffusion checkpoint}"
|
| 16 |
-
: "${VAE_PATH:?Set VAE_PATH to a local VAE checkpoint}"
|
| 17 |
-
|
| 18 |
-
MAX_STEPS=${MAX_STEPS:-120000}
|
| 19 |
-
VAL_EVERY_N_STEP=${VAL_EVERY_N_STEP:-2000}
|
| 20 |
-
CHECKPOINT_EVERY_N_STEPS=${CHECKPOINT_EVERY_N_STEPS:-2000}
|
| 21 |
-
LIMIT_BATCH=${LIMIT_BATCH:-1}
|
| 22 |
-
N_FRAMES_VALID=${N_FRAMES_VALID:-1100}
|
| 23 |
-
CONTEXT_LENGTH=${CONTEXT_LENGTH:-100}
|
| 24 |
-
ALGORITHM_CONTEXT_FRAMES=${ALGORITHM_CONTEXT_FRAMES:-600}
|
| 25 |
-
TRAIN_BATCH_SIZE=${TRAIN_BATCH_SIZE:-16}
|
| 26 |
-
VAL_BATCH_SIZE=${VAL_BATCH_SIZE:-1}
|
| 27 |
-
ACCUMULATE_GRAD_BATCHES=${ACCUMULATE_GRAD_BATCHES:-1}
|
| 28 |
-
NUM_WORKERS=${NUM_WORKERS:-4}
|
| 29 |
-
WANDB_MODE=${WANDB_MODE:-offline}
|
| 30 |
-
CURRICULUM_NO_UPDOWN_UNTIL_STEP=${CURRICULUM_NO_UPDOWN_UNTIL_STEP:-60000}
|
| 31 |
-
CURRICULUM="{enabled:true,stages:[{name:no_updown,until_step:${CURRICULUM_NO_UPDOWN_UNTIL_STEP},dataset:{wo_updown:true}},{name:with_updown,until_step:${MAX_STEPS},dataset:{wo_updown:false}}]}"
|
| 32 |
-
|
| 33 |
-
mkdir -p "${OUTPUT_DIR}"
|
| 34 |
-
|
| 35 |
-
torchrun --standalone --nproc_per_node=${NPROC_PER_NODE} -m main \
|
| 36 |
-
"+name=${RUN_NAME}" \
|
| 37 |
-
"+output_dir=${OUTPUT_DIR}/" \
|
| 38 |
-
auto_resume=true \
|
| 39 |
-
"wandb.mode=${WANDB_MODE}" \
|
| 40 |
-
"experiment.tasks=[training]" \
|
| 41 |
-
algorithm=dememwm_base \
|
| 42 |
-
+customized_load=true \
|
| 43 |
-
+seperate_load=true \
|
| 44 |
-
"+diffusion_model_path=${DIFFUSION_MODEL_PATH}" \
|
| 45 |
-
"+vae_path=${VAE_PATH}" \
|
| 46 |
-
dataset=video_minecraft_dememwm_latent \
|
| 47 |
-
"dataset.save_dir=${DATA_ROOT}" \
|
| 48 |
-
"dataset.precomputed_feature_dir=${FEATURE_ROOT}" \
|
| 49 |
-
dataset.n_frames=8 \
|
| 50 |
-
"dataset.n_frames_valid=${N_FRAMES_VALID}" \
|
| 51 |
-
"dataset.context_length=${CONTEXT_LENGTH}" \
|
| 52 |
-
dataset.single_eval_clip=true \
|
| 53 |
-
dataset.memory_selection.enabled=true \
|
| 54 |
-
dataset.memory_selection.max_anchor_frames=2 \
|
| 55 |
-
dataset.memory_selection.max_dynamic_frames=4 \
|
| 56 |
-
dataset.memory_selection.max_revisit_frames=2 \
|
| 57 |
-
dataset.memory_selection.causal=true \
|
| 58 |
-
dataset.memory_selection.dynamic.selection_policy=multiview \
|
| 59 |
-
dataset.memory_selection.dynamic.multiview_selector=fov_greedy \
|
| 60 |
-
dataset.memory_selection.pose_similarity_threshold=0.6 \
|
| 61 |
-
dataset.memory_selection.training_use_plucker=true \
|
| 62 |
-
dataset.memory_selection.training_plucker_weight=1.0 \
|
| 63 |
-
dataset.memory_selection.fov_overlap_threshold=0.6 \
|
| 64 |
-
dataset.memory_selection.min_total_selected_coverage=0.1 \
|
| 65 |
-
dataset.memory_selection.local_context_exclusion_frames=8 \
|
| 66 |
-
dataset.memory_selection.anchor_diverse_selection=true \
|
| 67 |
-
dataset.memory_selection.pose_preselect_topk=64 \
|
| 68 |
-
dataset.memory_selection.candidate_chunk_size=64 \
|
| 69 |
-
algorithm.causal=true \
|
| 70 |
-
algorithm.n_tokens=8 \
|
| 71 |
-
"algorithm.context_frames=${ALGORITHM_CONTEXT_FRAMES}" \
|
| 72 |
-
algorithm.metric_report_segment=100 \
|
| 73 |
-
+algorithm.log_per_frame_metrics=true \
|
| 74 |
-
algorithm.chunk_size=1 \
|
| 75 |
-
algorithm.warmup_steps=5000 \
|
| 76 |
-
algorithm.trainability.train_full_dit=true \
|
| 77 |
-
algorithm.trainability.full_dit_start_step=40000 \
|
| 78 |
-
algorithm.trainability.lr.memory_modules=4.0e-5 \
|
| 79 |
-
algorithm.trainability.lr.base_dit=1.0e-5 \
|
| 80 |
-
algorithm.log_video=true \
|
| 81 |
-
algorithm.save_local=true \
|
| 82 |
-
algorithm.diffusion.sampling_timesteps=20 \
|
| 83 |
-
algorithm.noise_route.anchor=all \
|
| 84 |
-
algorithm.noise_route.dynamic=all \
|
| 85 |
-
algorithm.noise_route.revisit=all \
|
| 86 |
-
algorithm.memory_noise.enabled=false \
|
| 87 |
-
algorithm.memory_noise.anchor_max_fraction=0.0 \
|
| 88 |
-
algorithm.memory_noise.dynamic_max_fraction=0.0 \
|
| 89 |
-
algorithm.memory_noise.revisit_max_fraction=0.0 \
|
| 90 |
-
+algorithm.memory_noise.validation_noisy_memory=false \
|
| 91 |
-
"experiment.training.curriculum=${CURRICULUM}" \
|
| 92 |
-
"experiment.training.batch_size=${TRAIN_BATCH_SIZE}" \
|
| 93 |
-
experiment.training.precision=16-mixed \
|
| 94 |
-
"experiment.training.optim.accumulate_grad_batches=${ACCUMULATE_GRAD_BATCHES}" \
|
| 95 |
-
experiment.training.optim.gradient_clip_val=1.0 \
|
| 96 |
-
"experiment.training.data.num_workers=${NUM_WORKERS}" \
|
| 97 |
-
"experiment.validation.data.num_workers=${NUM_WORKERS}" \
|
| 98 |
-
"experiment.validation.batch_size=${VAL_BATCH_SIZE}" \
|
| 99 |
-
"experiment.validation.limit_batch=${LIMIT_BATCH}" \
|
| 100 |
-
"experiment.validation.val_every_n_step=${VAL_EVERY_N_STEP}" \
|
| 101 |
-
"experiment.training.checkpointing.every_n_train_steps=${CHECKPOINT_EVERY_N_STEPS}" \
|
| 102 |
-
+experiment.training.checkpointing.save_top_k=5 \
|
| 103 |
-
+experiment.training.checkpointing.monitor=lpips \
|
| 104 |
-
+experiment.training.checkpointing.mode=min \
|
| 105 |
-
"experiment.training.max_steps=${MAX_STEPS}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|