Random seed★
import random, numpy as np, torch
def set_seed(seed):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
- 고정해야 하는 것:
- weight init
- data shuffle
- client sampling
- augmentation
Dataset split 고정
random_split(dataset, [train, test])
generator = torch.Generator().manual_seed(seed)
random_split(dataset, [train, test], generator=generator)
- split 결과를 파일로 저장
- train.txt / test.txt 식으로 고정
DataLoader 설정
DataLoader(
dataset,
shuffle=True,
worker_init_fn=seed_worker,
generator=g
)
def seed_worker(worker_id):
worker_seed = torch.initial_seed() % 2**32
np.random.seed(worker_seed)
random.seed(worker_seed)
CUDA deterministic 모드
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
모델 초기화 방식 고정
model = Net()
set_seed(seed)
model = Net()
환경 고정
- 예시
OS: Ubuntu 22.04
Python: 3.10
PyTorch: 2.1.0
CUDA: 12.1
GPU: RTX 3090
pip freeze > requirements.txt
코드 버전 고정
git commit -m "exp alpha=1 seed=44"
실험 로그로 저장
{
"seed": 44,
"alpha": 1,
"rounds": 1000
}
json.dump(vars(args), f)