Variable.cuda() or Variable.grad - DonghoonPark12/ssd.pytorch GitHub Wiki
์ฝ๋๋ฅผ ๋ณด๋ค๊ฐ ์ฒ์๋ณด๋ ๋ถ๋ถ์ด ๋์๋ค. input_var = Variable(input).cuda(), target_var = Variable(target).cuda() ์ ๊ฐ์ธ์ฃผ๋ ๊ฒ์ผ๊น.
for epoch in range(2):
logger.info("-- EPOCH: %s", epoch)
running_loss = 0.0
for i, data in enumerate(train_loader, 0):
if i % 50 == 49:
logger.info("-- ITERATION: %s", i)
input, target = data
# wrap input + target into variables
input_var = Variable(input).cuda()
target_var = Variable(target).cuda()
...
๋ค๋ฅธ ์ฝ๋๋ฅผ ๋ณด๋ ์๋์ ๊ฐ์ด ๋๊ฐ์ง๋ก ๊ตฌ๋ถ๋์ด ์์๋ค.
Variable(torch.randn(3,1,2).float().cuda(), requires_grad=True) # ํน์
Variable(torch.randn(3,1,2).float(), requires_grad=True).cuda()
๋ต๋ณ ์ค์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์์๋ค.
".cuda() creates another Variable that isnโt a leaf node in the computation graph"
.cuda()๋ ๊ณ์ฐ ๊ทธ๋ํ์์ ๋ฆฌํ(leaf) ๋
ธ๋๊ฐ ์๋ ๋ค๋ฅธ ๋ณ์๋ฅผ ์์ฑํ๋ค(?). ๋ฌด์จ ๋ง์ผ๊น.
์ค์
x = Variable(torch.randn(3,1,2).float(), requires_grad=True).cuda() ๋ผ ํ๋ฉด ์๋์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
y = Variable(torch.randn(3,1,2).float(), requires_grad=True)
x = y.cuda()
์ฌ๊ธฐ์ gradient๊ฐ ๊ณ์ฐ๋๋ ๊ฒ์ y์ด๋ฉฐ, x๊ฐ ์๋๋ค.
์์ ๋ต๋ณ์ ์ฐธ๊ณ ํด ๋ณผ๋, ์๋ ์ฝ๋์์ input_var๊ณผ target_var์ gradient๊ฐ ๊ณ์ฐ๋์ง ์๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ฃผ์๊น์ง ์ฒจ๋ถํด ๋ณด์๋ค.
# wrap input + target into variables
input_var = Variable(input).cuda() # non-leaf Variable, result of operation, gradient would be 'None'
target_var = Variable(target).cuda()
๋ง์ฝ ๊ณ์ฐ๋๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ์ฝ๋๋ก ๋ฐ๊พผ๋ค.
# wrap input + target into variables
input_var = Variable(input.cuda(), require_grad=True) # leaf Variable, user created
target_var = Variable(target.cuda, , require_grad=True)
ํ์ง๋ง, ์์ ๋ต๋ณ๋ค์ ๋์ ๊ถ๊ธ์ฆ์ ํด์ํด์ฃผ์ง ๋ชปํ๋ค. ์คํ๋ ค ๊ถ๊ธ์ฆ์ ๋ ํค์ด๋ค. Variable()๋ก ๊ฐ์ธ๋ ์ด์ ๋ ๋ฌด์์ผ๊น ์ฌ์ง์ด gradient๋ฅผ ๊ณ์ฐํ์ง๋ ์์๊บผ๋ฉด์ .cuda()๋ ์ ๋ถ์ด๋ ๊ฒ์ผ๊น?
# wrap input + target into variables
input_var = Variable(input).cuda()
target_var = Variable(target).cuda()
pytorch 1.10๊ธฐ์ค์ผ๋ก Variable()์ ๋์ด์ ์ฌ์ฉํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์๋์ ์ฝ๋๋ก ๋์ฒดํ๋ค.
(์ด๋, ์ํฅ๋ pytorch๋ฒ์ ์์ input_var๊ณผ target_var์ leaf_variable์ผ๊น, non-leaf variable์ผ๊น?)
# wrap input + target into variables
input_var = input.cuda()
target_var = target.cuda()
์ด์ ๋ง์ง๋ง์ผ๋ก ๋จ์ ์ง๋ฌธ์ .cuda()๋ก ๊ฐ์ธ๋ ์ด์ ์ด๋ค. input_var๊ณผtarget_var์ด gpu์ ๋ฌด์ ๋ฐ๋ผ ๋ฌ๋ผ์ ธ์ผ ๋๋ ์ด์ ๋ ๋ฌด์์ผ๊น. ์ง๋ฌธ์ ๋จ๊ฒผ๋ค. ๊ธฐ๋ค๋ ค ๋ณด์.
[Reference]
https://discuss.pytorch.org/t/how-to-get-cuda-variable-gradient/1386
https://discuss.pytorch.org/t/strange-behavior-of-variable-cuda-and-variable-grad/1642