-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrun_text_exp.sh
More file actions
executable file
·108 lines (87 loc) · 3.58 KB
/
Copy pathrun_text_exp.sh
File metadata and controls
executable file
·108 lines (87 loc) · 3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/bin/bash
# 定义要遍历的seed列表
SEEDS=(10 20 30 40 50)
# 定义数据集列表及其对应的GPU和端口偏移量
declare -A DATASET_CONFIG=(
["Rotten_Tomatoes"]="0 0" # GPU 0, 端口偏移量 0
["imdb"]="1 10" # GPU 1, 端口偏移量 10
["ag_news"]="2 20" # GPU 2, 端口偏移量 20
["20_newsgroups"]="3 30" # GPU 3, 端口偏移量 30
)
# 定义模型配置:原始transformer和convolution
MODELS=(
# "0 transformer_base.yaml" # 原始transformer,模型偏移量 0
"1 conv_base.yaml" # convolution模型,模型偏移量 1
)
# 基础端口号
BASE_PORT=20700
# 创建日志目录
LOG_DIR="logs"
mkdir -p "$LOG_DIR"
# 遍历每个seed
for SEED in "${SEEDS[@]}"; do
echo "========================================"
echo "开始运行seed: $SEED"
echo "========================================"
# 存储当前seed批次的所有进程ID和任务信息
declare -A PID_TO_TASK=() # PID -> "DATASET MODEL"
PIDS=()
# 遍历每个数据集
for DATASET in "${!DATASET_CONFIG[@]}"; do
# 获取该数据集对应的GPU和端口偏移量
read GPU DATASET_PORT_OFFSET <<< "${DATASET_CONFIG[$DATASET]}"
# 遍历所有模型配置(transformer和convolution)
for MODEL in "${MODELS[@]}"; do
# 解析配置参数
read MODEL_OFFSET CFG_SUFFIX <<< "$MODEL"
# 根据数据集和模型配置构建完整路径和唯一端口
CFG="cfgs/${DATASET}/${CFG_SUFFIX}"
# 计算唯一端口:基础端口 + 数据集偏移 + 模型偏移 + seed
PORT=$((BASE_PORT + DATASET_PORT_OFFSET * 100 + MODEL_OFFSET * 10 + SEED))
# 构造标签
TAG="seed_${SEED}_new_gate"
# 检查配置文件是否存在
if [ ! -f "$CFG" ]; then
echo " 警告: 配置文件 $CFG 不存在,跳过..."
continue
fi
# 创建日志文件路径
mkdir -p "${LOG_DIR}/${DATASET}"
LOG_FILE="${LOG_DIR}/${DATASET}/${CFG_SUFFIX%.yaml}_seed${SEED}.log"
# 后台运行命令并记录PID
nohup env CUDA_VISIBLE_DEVICES=$GPU torchrun --nproc_per_node=1 --master-port=$PORT main.py \
--cfg "$CFG" --seed $SEED --tag "$TAG" > "$LOG_FILE" 2>&1 &
# 保存进程ID和任务信息
PID=$!
PIDS+=($PID)
PID_TO_TASK[$PID]="${DATASET} ${CFG_SUFFIX}"
echo " 启动任务: DATASET=$DATASET, MODEL=$CFG_SUFFIX, GPU=$GPU, PORT=$PORT, PID=$PID"
echo " 日志文件: $LOG_FILE"
done
done
# 显示启动的任务总数
TOTAL_TASKS=${#PIDS[@]}
echo ""
echo " 已启动 $TOTAL_TASKS 个任务"
echo " 等待所有任务完成..."
echo ""
# 等待当前seed的所有任务完成
COMPLETED=0
FAILED=0
for PID in "${PIDS[@]}"; do
if wait $PID; then
COMPLETED=$((COMPLETED + 1))
TASK_INFO="${PID_TO_TASK[$PID]}"
echo " ✓ 任务完成: $TASK_INFO (PID: $PID)"
else
FAILED=$((FAILED + 1))
TASK_INFO="${PID_TO_TASK[$PID]}"
echo " ✗ 任务失败: $TASK_INFO (PID: $PID)"
fi
done
echo ""
echo "seed $SEED 执行完毕: 成功=$COMPLETED, 失败=$FAILED, 总计=$TOTAL_TASKS"
echo "========================================"
echo ""
done
echo "所有seed的任务都已完成!"