μλ νμΈμ, μ΄ λ²κ·Έκ° λ°μνμ΅λλ€:
optimizer.step()
exp_avg.mul_(beta1).add_(1 - beta1, grad)
TypeError: add_ received an invalid combination of arguments - got (float, torch.cuda.FloatTensor), but expected one of:
* (float value)
* (torch.FloatTensor other)
* (torch.SparseFloatTensor other)
* (float value, torch.FloatTensor other)
didn't match because some of the arguments have invalid types: (float, torch.cuda.FloatTensor)
* (float value, torch.SparseFloatTensor other)
didn't match because some of the arguments have invalid types: (float, torch.cuda.FloatTensor)
μ½λ μ€μΌλ ν€μ λ€μκ³Ό κ°μ΅λλ€.
model = Model()
model.load_state_dict(checkpoint['model'])
model.cuda()
optimizer = optim.Adam()
optimizer.load_state_dict(checkpoint['optimizer'])
...
# In train loop
for epoch in range(...):
...
optimizer.step()
-> BUG <-
λ‘λλ param_groups
κ° torch.cuda.FloatTensor
μΈ κ² κ°μΌλ©° ν΄κ²° λ°©λ²μ μλνμ΅λλ€.
optmizer.param_groups
λ₯Ό cpu
λ‘ μ΄λνμ§λ§ μ¬μ ν λμΌν λ²κ·Έκ° μμ΅λλ€.
λ¬Έμ λ₯Ό μ¬ννκΈ° μν μ 체 μ€ν¬λ¦½νΈλ₯Ό μ 곡ν μ μμ΅λκΉ?
μ΄μ©λ©΄ λΉμ μ μ΄λ κ² μλ ν μ μμ΅λλ€,
Optimizer.step()
exp_avg.mul_(λ² ν1).add_(1 - λ² ν1, grad.cpu())
μ£μ‘ν©λλ€. λ΅μ₯ μ΄λ©μΌμ λμ³€μ΅λλ€.
μ§κΈ μ¬μκΈ°λ₯Ό μ 곡ν μ μμ΅λλ€. OpenNMT-py νλ‘μ νΈ : https://github.com/OpenNMT/OpenNMT-pyμμ lr μ
λ°μ΄νΈλ₯Ό μν΄ lr_scheduler
λ₯Ό μ¬μ©νλ €κ³ νλ μμ
μ
λλ€. κ·Έλ¦¬κ³ resume a suspended training
μΌμ΄μ€λ₯Ό ν
μ€νΈν λ μ΄ λ¬Έμ κ° λ°μνμ΅λλ€. κ·Έλμ μμμ μ΄ λ¬Έμ μ λν μ½λ 골격μ μ μΈνμ΅λλ€.
@hefeicypκ° μ μνλ κ²κ³Ό κ°μ νΈλ¦μ ν¬ν¨νμ¬ μ¬λ¬ λ°©λ²μ μλνμ§λ§ μ¬μ ν λ°μν©λλ€.
λ΄ λΆμμ λ°λ₯΄λ©΄ μ΄μ κ΅μ‘μ΄ GPUμμ μνλμκΈ° λλ¬Έμ optimizer.state_dict
μ μ₯ν λ μ μ₯λ μν(ν
μ)λ cuda
λ²μ μ
λλ€. μ¬κ°νλ λμ μ μ₯λ μ΅ν°λ§μ΄μ λ₯Ό λ‘λν λ load_state_dict()
μ΄ cuda
λ²μ μ cpuλ‘ λ‘λν©λλ€(λͺ¨λΈ( nn.Module
)λ gpuλ‘ μ½κ² μ΄λν μ μμ§λ§ torch.optimizer
μ΄ λ₯λ ₯μ΄ λΆμ‘±ν κ² κ°μ΅λκΉ?) , κ·Έλμ μ΄ λ¬Έμ κ° λνλ©λλ€.
체ν¬ν¬μΈνΈμμ λ‘λν ν μ΅ν°λ§μ΄μ μνλ₯Ό GPU λ©λͺ¨λ¦¬λ‘ μλμΌλ‘ μ΄λν΄ λ³΄μμμ€.
optimizer = optim.Adam()
optimizer.load_state_dict(checkpoint['optimizer'])
for state in optimizer.state.values():
for k, v in state.items():
if isinstance(v, torch.Tensor):
state[k] = v.cuda()
μ΄ μμ
μ optimizer.cuda()
λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€λ λ° λμν©λλ€.
@dogancan , κ°μ¬ν©λλ€. λ€λ₯Έ λ¬Έμ λ‘ μΈν΄ μμ μ΄ μ€λ¨λμμ΅λλ€. μ¬κ°λλ©΄ κ·νμ λ°©λ²μ μλνκ² μ΅λλ€.
@dogancan μ μ루μ
μ΄ μλνμ§ μμ κ² κ°μ΅λλ€. κ·Έλ¬λ©΄ μ€λ₯κ° μ¬λΌμ§μ§λ§ μ΅ν°λ§μ΄μ λ λ μ΄μ λͺ¨λΈμ νλ ¨νμ§ μμ΅λλ€. λͺ¨λμ λ€λ₯Έ μ νμ΄λ μ₯μΉλ‘ μΊμ€ν
ν ν μ΅ν°λ§μ΄μ λ₯Ό λ€μ μμ±ν΄μΌ νλ©° load_state_dict
λ₯Ό μ¬μ©νμ¬ μ΄μ 볡μ¬λ³Έμμ μνλ₯Ό 볡μν μ μμ΅λλ€. μ΄κ²μ νμ¬ μλνμ§ μμ§λ§ μμ ν΄μΌ ν©λλ€(ν
μλ₯Ό μ§μ μ¬μ©νλ λμ μν λμ
λ리μμ λ°μ΄ν°λ₯Ό 볡μ¬νμ¬ κ΅μ°¨ μ₯μΉ λλ κ΅μ°¨ μ ν μ
λ°μ΄νΈλ₯Ό νμ©ν©λλ€).
@apaszke , λ€, κ·νμ λ°©λ²μ νμ¬ μ¬μ©νλ λ°©λ²μ΄λ©° μλν©λλ€. νμ§λ§ μ μ€νΈλ¦Όμμ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν λκΉμ§ κΈ°λ€λ¦΄ κ²μ λλ€. λΉμ μ νλ₯ν μνμ κ°μ¬λ립λλ€!
@apaszke μ, λ΄ λμ. μ΅ν°λ§μ΄μ κ° λ€μ μμ±λλ μ€μ μ λ°μ΄νΈνλ κ²μ μμμ΅λλ€. κ·Έλ¬λ κ·Έλ μ§ μμΌλ©΄ λ€μ μμ μ μνν΄μΌ ν©λλ€. λ§μ΅λκΉ?
model = Model()
model.load_state_dict(checkpoint['model'])
model.cuda()
optimizer = optim.Adam(model.parameters())
optimizer.load_state_dict(checkpoint['optimizer'])
for state in optimizer.state.values():
for k, v in state.items():
if isinstance(v, torch.Tensor):
state[k] = v.cuda()
μ, λ§μ. μλν΄μΌ ν©λλ€ π
λΉμ μ΄ μ¬μ©ν΄μΌνλ€λ μ μ μ μΈνκ³ torch.is_tensor(v)
λμ isinstance(v, torch.Tensor)
λΉμ·ν λ¬Έμ κ°μμμ΅λλ€. GPU 0 μ΄μΈμ GPUμμ μ΅ν°λ§μ΄μ μνλ₯Ό μ μ₯ν λ€μ μνλ₯Ό λ‘λνλ©΄ μ¬μ ν λͺ¨λ κ²μ΄ GPU 0μ λ‘λλ©λλ€. map_location
μ torch.load()
map_location
λ₯Ό μ§μ ν΄λ μλνμ§ μμμ΅λλ€. @dogancan μ μ루μ
μ μ΄κ²μ ν΄κ²°ν©λλ€.
μλ νμΈμ μ¬λ¬λΆ, μ΄ μ€λ λμ λ¬Έμ μ λ§€μ° μ μ¬ν λ¬Έμ κ° μμ΅λλ€. μ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
model = inceptionresnetv2(num_classes=config['tr_classes'])
model = torch.nn.DataParallel(model).cuda()
model.load_state_dict(checkpoint['md_state_dict'])
optimizer = torch.optim.Adam(model.parameters(), lr=config['tr_lr'], weight_decay=config['tr_weightdecay'])
optimizer.load_state_dict(checkpoint['md_optimizer'])
for state in optimizer.state.values():
for k, v in state.items():
if torch.is_tensor(v):
state[k] = v.cuda()
κ·Έλ¦¬κ³ λ€μ μμνλ©΄ μ΅ν°λ§μ΄μ μμ KeyErrorsκ° λ°μν©λλ€.
---> 40 optimizer.step()
41
42 config['am_batch_time'].update(time.time() - end)
~/.conda/envs/env_pytorch/lib/python3.5/site-packages/torch/optim/adam.py in step(self, closure)
44 continue
45 grad = p.grad.data
---> 46 state = self.state[p]
47
48 # State initialization
KeyError: Parameter containing:
(0 ,0 ,.,.) =
-1.6336e-01 -5.6482e-01 -4.2228e-02
...
[torch.cuda.FloatTensor of size 32x3x3x3 (GPU 0)]
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ μκ³ μμ΅λκΉ? BTW, μ λ 8κ°μ GPUλ₯Ό μ¬μ©νκ³ μμ΅λλ€. μ΄ λ¬Έμ κ° κ·Έ λλ¬ΈμΈμ§ μΆμΈ‘νκ³ μμ΅λλ€.
@CodArs-van λ€μ€ GPU λ¬Έμ λ₯Ό ν΄κ²°ν μ μμμ΅λκΉ?
@rafaelvalle μ§λ¬Έ
κ·Έλ₯ λκΈ, μ΄ λ¬Έμ λ
def load_state_dict(self, state_dict):
...
# deepcopy, to be consistent with module API
state_dict = deepcopy(state_dict)
...
deepcopy
λ λͺ¨λ μν ν
μλ₯Ό GPU0μΌλ‘ μ΄λν©λλ€.
λ°λΌμ μ΅ν°λ§μ΄μ μ μνλ₯Ό νΉμ GPUλ‘ μ΄λνλ©΄ μ΄ λ¬Έμ κ° ν΄κ²°λ©λλ€.
μλ νμΈμ @lzcnλ , λ€λ₯Έ ν μμ νΉμ GPU μμΉλ₯Ό 미리 μ΄λ»κ² μ μ μμ΅λκΉ?
λͺ¨λ torch.save() νΈμΆμ΄ νμ μλμΌλ‘ μμ±λ CPU λ²μ μ μ¬μ©νλ κΈ°λ₯μ΄ μ€ν κ°λ₯ν©λκΉ?
κ·Έλ¦¬κ³ λ€μ μμν λ torch.load()λ μ¬μ© μ€μΈ "νμ¬" μ₯μΉ(λλ λ λμ μ λ΅)λ₯Ό μ¬μ©ν©λλ€.
νμ¬ λͺ¨λΈ/μ΅ν°λ§μ΄μ /μ€μΌμ€λ¬/λ±μ μ₯μΉ κ°μ μ μ₯ λ° λ‘λκ° μΌκ΄λλλ‘ νκΈ° μν΄ λ§μ μμ©κ΅¬ μ½λκ° νμν κ² κ°μ΅λλ€.
λΉμ·ν λ¬Έμ κ° λ°μνμ¬ @dogancan μ μ루μ μ λ°λΌ model, model.cuda() λ° DataParallel(model)μ λ€μ λ‘λν ν optimizer.cuda() μμ΄ Adam μ΅μ ν νλ‘κ·Έλ¨μ λ€μ
κ°μ¬ν©λλ€. μλν©λλ€!
@apaszke μ, λ΄ λμ. μ΅ν°λ§μ΄μ κ° λ€μ μμ±λλ μ€μ μ λ°μ΄νΈνλ κ²μ μμμ΅λλ€. κ·Έλ¬λ κ·Έλ μ§ μμΌλ©΄ λ€μ μμ μ μνν΄μΌ ν©λλ€. λ§μ΅λκΉ?
model = Model() model.load_state_dict(checkpoint['model']) model.cuda() optimizer = optim.Adam(model.parameters()) optimizer.load_state_dict(checkpoint['optimizer']) for state in optimizer.state.values(): for k, v in state.items(): if isinstance(v, torch.Tensor): state[k] = v.cuda()
@apaszke
μλ
νμΈμ, λ§μνμ λλ‘ λͺ¨λΈμ λ€λ₯Έ μ₯μΉλ‘ μ΄λν λλ§λ€ μ΅ν°λ§μ΄μ λ₯Ό λΉλν΄μΌ νμ§λ§ λͺ¨λΈμ λ€λ₯Έ μ₯μΉλ‘ μ΄λνκ³ λ€λ‘ μ΄λνλ©΄ μ΅ν°λ§μ΄μ λ₯Ό λ€μ λΉλν΄μΌ ν©λκΉ?
λ€μμ μμ μ½λμ
λλ€.
model = Model()
model.cuda()
optimizer = optim.Adam(model.parameters())
for d, gt in trn_dataloader:
# train
...
optimizer.step()
model.cpu() # move to cpu
# eval or do other things
...
model.cuda() # but finnally, move back
μ΅μ ν νλ‘κ·Έλ¨μ΄ μμλλ‘ μ€νλ©λκΉ?
λν model.to(model.device)
νλ©΄ μ΅ν°λ§μ΄μ λ₯Ό λ€μ λΉλν΄μΌ ν©λκΉ?
@apaszke μ, λ΄ λμ. μ΅ν°λ§μ΄μ κ° λ€μ μμ±λλ μ€μ μ λ°μ΄νΈνλ κ²μ μμμ΅λλ€. κ·Έλ¬λ κ·Έλ μ§ μμΌλ©΄ λ€μ μμ μ μνν΄μΌ ν©λλ€. λ§μ΅λκΉ?
model = Model() model.load_state_dict(checkpoint['model']) model.cuda() optimizer = optim.Adam(model.parameters()) optimizer.load_state_dict(checkpoint['optimizer']) for state in optimizer.state.values(): for k, v in state.items(): if isinstance(v, torch.Tensor): state[k] = v.cuda()
@apaszke μ΄λ κ² μμλ₯Ό
```νμ΄μ¬
λͺ¨λΈ = λͺ¨λΈ()
model.to('μΏ λ€')
μ΅ν°λ§μ΄μ = optim.Adam(model.parameters())
optimizer.load_state_dict(체ν¬ν¬μΈνΈ['μ΅ν°λ§μ΄μ '])
optimizer.state.values()μ μν:
state.items()μ k, vμ κ²½μ°:
if isinstance(v, torch.Tensor):
μν[k] = v.cuda()
model.load_state_dict(체ν¬ν¬μΈνΈ['λͺ¨λΈ'])
λͺ¨λΈμ 'cuda'λ‘ μ΄λνμ§λ§ μ΅ν°λ§μ΄μ μ μν λμ λ리λ₯Ό λ¨Όμ λ‘λν ν 체ν¬ν¬μΈνΈμμ μν λμ λλ¦¬λ§ λ‘λνλ€λ μλ―Έμ λκΉ?
λ¬Έμ λ μ΅ν°λ§μ΄μ μ μνκ° λͺ¨λΈκ³Ό λμΌνκ² μ₯μΉμ λ‘λλλ€λ κ²°λ‘ μ λ΄λ¦΄ μ μμ΅λλ€. λ¨Όμ λͺ¨λΈμ GPUμ λ‘λν λ€μ μ΅ν°λ§μ΄μ μ μνλ₯Ό λ‘λν΄μΌ ν©λλ€. λͺ¨λΈκ³Ό μ΅μ ν νλ‘κ·Έλ¨μ μνκ° λͺ¨λ GPUμ λ‘λλλλ‘ ν©λλ€.
cpuμ λ‘λν ν μ΅ν°λ§μ΄μ λ₯Ό cudaλ‘ μ΄λνλ λμ cudaμμ μ§μ 체ν¬ν¬μΈνΈλ₯Ό λ‘λν μ μμ΅λλ€.
model.to(device)
ckpt = torch.load(<model_path>, map_location=device)
model.load_state_dict(ckpt['state_dict'])
optimizer.load_state_dict(ckpt['optimizer'])
scheduler.load_state_dict(ckpt['scheduler'])
del ckpt
κ°μ₯ μ μ©ν λκΈ
@apaszke μ, λ΄ λμ. μ΅ν°λ§μ΄μ κ° λ€μ μμ±λλ μ€μ μ λ°μ΄νΈνλ κ²μ μμμ΅λλ€. κ·Έλ¬λ κ·Έλ μ§ μμΌλ©΄ λ€μ μμ μ μνν΄μΌ ν©λλ€. λ§μ΅λκΉ?