Skip to content

Commit 17718eb

Browse files
authored
intermediate/autograd_saved_tensors_hooks_tutorial κ°œμ„  (#623)
* fixing translations * update translations
1 parent b0c0025 commit 17718eb

1 file changed

Lines changed: 72 additions & 54 deletions

File tree

β€Žintermediate_source/autograd_saved_tensors_hooks_tutorial.pyβ€Ž

Lines changed: 72 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
λ―ΈλΆ„μžλ™ν™”(autograd) μ €μž₯된 ν…μ„œλ₯Ό μœ„ν•œ Hooks
2+
λ―ΈλΆ„μžλ™ν™”(autograd) μ €μž₯된 tensorλ₯Ό μœ„ν•œ Hooks
33
================================================
44
55
"""
@@ -8,9 +8,11 @@
88
######################################################################
99
# νŒŒμ΄ν† μΉ˜λŠ” 일반적으둜 μ—­μ „νŒŒλ₯Ό μ‚¬μš©ν•˜μ—¬ 기울기λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
1010
# κ·ΈλŸ¬λ‚˜ νŠΉμ • μž‘μ—…μ—μ„œλŠ” μ—­μ „νŒŒλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ 쀑간결과λ₯Ό μ €μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.
11-
# 이번 νŠœν† λ¦¬μ–Όμ—μ„œλŠ” μ΄λŸ¬ν•œ ν…μ„œλ₯Ό μ €μž₯/κ²€μƒ‰ν•˜λŠ” 방법과 νŒ¨ν‚Ή/μ–ΈνŒ¨ν‚Ή ν”„λ‘œμ„ΈμŠ€λ₯Ό μ œμ–΄ν•˜κΈ°μœ„ν•œ hooks을 μ •ν•˜λŠ” 방법을 μ•ˆλ‚΄ν•©λ‹ˆλ‹€.
11+
# 이번 νŠœν† λ¦¬μ–Όμ—μ„œλŠ” μ΄λŸ¬ν•œ tensorλ₯Ό μ €μž₯/κ²€μƒ‰ν•˜λŠ” 방법과
12+
# νŒ¨ν‚Ή/μ–ΈνŒ¨ν‚Ή 절차λ₯Ό μ œμ–΄ν•˜λŠ” hooks을 μ •μ˜ν•˜λŠ” 방법을 μ•ˆλ‚΄ν•©λ‹ˆλ‹€.
1213

13-
# 이 νŠœν† λ¦¬μ–Όμ—μ„œλŠ” μ‚¬μš©μžκ°€ μ—­μ „νŒŒκ°€ μ΄λ‘ μƒμ—μ„œ μž‘λ™ν•˜λŠ” 방식에 μ΅μˆ™ν•˜λ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. μ•„λ‹ˆλΌλ©΄, μ•„λž˜μ˜ 자료λ₯Ό λ¨Όμ € μ½μ–΄λ³΄μ„Έμš”.
14+
# 이 νŠœν† λ¦¬μ–Όμ—μ„œλŠ” λ…μžκ°€ μ—­μ „νŒŒκ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€λ₯Ό 이둠적으둜 잘 μ•Œκ³  μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.
15+
# μ•„λ‹ˆλΌλ©΄, μ•„λž˜μ˜ 자료λ₯Ό λ¨Όμ € μ½μ–΄λ³΄μ„Έμš”.
1416
# https://colab.research.google.com/drive/1aWNdmYt7RcHMbUk-Xz2Cv5-cGFSWPXe0#scrollTo=AHcEJ6nXUb7W
1517

1618
######################################################################
@@ -19,13 +21,14 @@
1921

2022

2123
######################################################################
22-
# λͺ¨λΈμ˜ ν›ˆλ ¨μ€ 일반적으둜 λͺ¨λΈμ„ μΈνΌλŸ°μŠ€ν•˜λŠ” 것보닀 ν•™μŠ΅ν•˜λŠ” κ³Όμ •μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό 더 많이 μ‚¬μš©ν•©λ‹ˆλ‹€.
23-
# λŒ€λž΅μ μœΌλ‘œ λ§ν•˜λ©΄ νŒŒμ΄ν† μΉ˜λŠ” μ—­μ „νŒŒλ₯Ό ν˜ΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ 계산 κ·Έλž˜ν”„λ₯Ό μ €μž₯ν•΄μ•Όν•˜λ―€λ‘œ μΆ”κ°€ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
24-
# 이 νŠœν† λ¦¬μ–Όμ˜ ν•œκ°€μ§€ λͺ©ν‘œλŠ” μ΄λŸ¬ν•œ 이해에 λŒ€ν•œ λ―Έμ„Έ 쑰정을 μ‹€ν–‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
24+
# 일반적으둜 λͺ¨λΈμ„ μΆ”λ‘ ν•˜λŠ” 것보닀 ν•™μŠ΅ν•˜λŠ” κ³Όμ •μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό 더 많이 μ‚¬μš©ν•©λ‹ˆλ‹€.
25+
# λŒ€λž΅μ μœΌλ‘œ λ§ν•˜λ©΄ νŒŒμ΄ν† μΉ˜λŠ” μ—­μ „νŒŒλ₯Ό ν˜ΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ 계산 κ·Έλž˜ν”„λ₯Ό μ €μž₯ν•΄μ•Όν•˜λ―€λ‘œ
26+
# μΆ”κ°€ λ©”λͺ¨λ¦¬ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
27+
# 이 νŠœν† λ¦¬μ–Όμ˜ λͺ©ν‘œ 쀑 ν•˜λ‚˜λŠ” 이런 λ‚΄μš©μ„ 이해와 λ―Έμ„Έ 쑰정을 μ œκ³΅ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
2528
#
26-
# 사싀, 이 κ·Έλž˜ν”„ μžμ²΄λ‘œλŠ” 가끔은 κ·Έλ‹€μ§€ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜μ§„ μ•ŠμŠ΅λ‹ˆλ‹€. μ—¬νƒ€μ˜ ν…μ„œλ“€μ„ λ³΅μ œν•˜μ§€ μ•ŠλŠ” 것 μ²˜λŸΌμš”.
27-
# κ·ΈλŸ¬λ‚˜, κ·Έλž˜ν”„λŠ” *μ°Έμ‘°* λ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
28-
# κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ ν…μ„œλ₯Ό : **μ €μž₯된 ν…μ„œ** 라고 λͺ…λͺ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
29+
# μ‹€μ œλ‘œ λ•Œλ•Œλ‘œ (μ—°μ‚°) κ·Έλž˜ν”„ μžμ²΄λŠ” tensor듀을 μ „ν˜€ λ³΅μ œν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ†Œλͺ¨ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
30+
# ν•˜μ§€λ§Œ, κ·Έλž˜ν”„λŠ” λ²”μœ„μ—μ„œ λ²—μ–΄λ‚œ tensor듀에 λŒ€ν•œ *μ°Έμ‘°(reference)* λŠ” μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
31+
# μ΄λŸ¬ν•œ tensor듀을 **μ €μž₯된 tensor(saved tensor)** 라고 ν•©λ‹ˆλ‹€.
2932

3033

3134
######################################################################
@@ -34,8 +37,8 @@
3437

3538

3639
######################################################################
37-
# κ°„λ‹¨ν•œ 예제λ₯Ό μ‹œμž‘ν•΄λ΄…μ‹œλ‹€: :math:`y = a \cdot b` , 이것은 λ―ΈλΆ„λŸ‰(κ·Έλž˜λ””μ–ΈνŠΈ)둜 μ•Œκ³ μžˆλŠ” :math: `y`,둜 각각 :math: `a` and
38-
# :math: `b`:둜 μƒμ •ν•©λ‹ˆλ‹€.
40+
# κ°„λ‹¨ν•œ 예제λ₯Ό μ‹œμž‘ν•΄λ΄…μ‹œλ‹€: :math:`y = a \cdot b`, 변화도λ₯Ό μ•Œκ³ μžˆλŠ” :math: `y`,둜 각각 :math: `a` and
41+
# :math: `b`:둜 ν•©λ‹ˆλ‹€.
3942

4043
# .. math:: \frac{\partial y}{\partial a} = b
4144
# .. math:: \frac{\partial y}{\partial b} = a
@@ -55,22 +58,25 @@
5558

5659

5760
######################################################################
58-
# 이 μ˜ˆμ œμ—μ„œ νŒŒμ΄ν† μΉ˜λŠ” 쀑간 κ°’ :math: `a` 및 :math: `b` λ₯Ό μ €μž₯ν•˜μ—¬ μ—­λ°©ν–₯ λ™μ•ˆ 기울기λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
61+
# 이 μ˜ˆμ œμ—μ„œ νŒŒμ΄ν† μΉ˜λŠ” 쀑간 κ°’ :math: `a` 및 :math: `b` λ₯Ό μ €μž₯ν•˜μ—¬
62+
# μ—­λ°©ν–₯ λ™μ•ˆ 변화도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
5963
#
6064
# .. figure:: https://user-images.githubusercontent.com/8019486/130124538-3da50977-6f0b-46d0-8909-5456ade9b598.png
6165
# :width: 300
6266
# :align: center
6367

6468

6569
######################################################################
66-
# μ΄λŸ¬ν•œ 쀑간 κ°’(μœ„μ˜ 주황색)은 접두사 ``_saved``둜 μ‹œμž‘ν•˜λŠ” ``y``의 ``grad_fn`` 속성을 μ°Ύμ•„ (디버깅 λͺ©μ μœΌλ‘œ) μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
70+
# μ΄λŸ¬ν•œ 쀑간 κ°’(μœ„μ˜ 주황색)은 접두사 ``_saved``둜 μ‹œμž‘ν•˜λŠ”
71+
# ``y``의 ``grad_fn`` 속성을 μ°Ύμ•„ (디버깅 λͺ©μ μœΌλ‘œ) μ ‘κ·Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
6772

6873
print(y.grad_fn._saved_self)
6974
print(y.grad_fn._saved_other)
7075

7176

7277
######################################################################
73-
# 계산 κ·Έλž˜ν”„κ°€ κΉŠμ–΄μ§ˆμˆ˜λ‘ *μ €μž₯된 ν…μ„œ*κ°€ 더 많이 μ €μž₯λ©λ‹ˆλ‹€. ν•œνŽΈ, ν…μ„œλŠ” κ·Έλž˜ν”„κ°€ μ•„λ‹ˆμ—ˆλ‹€λ©΄ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ²Œ λ©λ‹ˆλ‹€.
78+
# 계산 κ·Έλž˜ν”„κ°€ κΉŠμ–΄μ§ˆμˆ˜λ‘ *μ €μž₯된 tensor*κ°€ 더 많이 μ €μž₯λ©λ‹ˆλ‹€.
79+
# ν•œνŽΈ, tensorλŠ” κ·Έλž˜ν”„κ°€ μ•„λ‹ˆμ—ˆλ‹€λ©΄ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ²Œ λ©λ‹ˆλ‹€.
7480

7581
def f(x):
7682
return x * x
@@ -86,17 +92,20 @@ def f(x):
8692
######################################################################
8793
# μœ„μ˜ μ˜ˆμ œμ—μ„œ λ―ΈλΆ„(grad)없이 μ‹€ν–‰ν•˜λ©΄ λ²”μœ„λ‚΄μ˜ ``x`` 와 ``y`` λŠ” μœ μ§€λ˜μ§€λ§Œ
8894
# κ·Έλž˜ν”„μ—μ„œλŠ” ``f(x)`` 와 ``f(f(x))`` κ°€ μΆ”κ°€λ‘œ μ €μž₯λ©λ‹ˆλ‹€.
89-
# λ”°λΌμ„œ ν›ˆλ ¨ 쀑 μ •λ°©ν–₯ 경둜λ₯Ό μ‹€ν–‰ν•˜λ©΄ 평가쀑에 (더 μ •ν™•ν•˜κ²ŒλŠ” μžλ™λ―ΈλΆ„(auto grad)κ°€ ν•„μš”ν•˜μ§€ μ•Šμ€ κ²½μš°λ³΄λ‹€) λ©”λͺ¨λ¦¬ μ‚¬μš©λΉ„μ€‘μ΄ 더 λ§Žμ•„μ§€κ²Œ λ©λ‹ˆλ‹€.
95+
# λ”°λΌμ„œ ν›ˆλ ¨ 쀑 μ •λ°©ν–₯ 경둜λ₯Ό μ‹€ν–‰ν•˜λ©΄ 평가쀑에
96+
# (더 μ •ν™•ν•˜κ²ŒλŠ” μžλ™λ―ΈλΆ„(auto grad)κ°€ ν•„μš”ν•˜μ§€ μ•Šμ€ κ²½μš°λ³΄λ‹€)
97+
# λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 더 λ§Žμ•„μ§€κ²Œ λ©λ‹ˆλ‹€.
9098

9199

92100
######################################################################
93101
# νŒ¨ν‚Ήκ³Ό μ–ΈνŒ¨ν‚Ήμ˜ κ°œλ…
94-
# ~~~~~~~~~~~~~~~~~~~
102+
# ~~~~~~~~~~~~~~~~~~~~
95103

96104

97105

98106
######################################################################
99-
# 첫 번째 예제둜 λŒμ•„κ°€μ„œ ``y.grad_fn._saved_self`` 와 ``y.grad_fn._saved_other`` λŠ” 각각 μ›λž˜ ν…μ„œ 객체 ``a`` 와 ``b`` λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
107+
# 첫 번째 예제둜 λŒμ•„κ°€μ„œ ``y.grad_fn._saved_self`` 와 ``y.grad_fn._saved_other`` λŠ”
108+
# 각각 μ›λž˜ tensor 객체 ``a`` 와 ``b`` λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
100109

101110
a = torch.randn(5, requires_grad=True)
102111
b = torch.ones(5, requires_grad=True)
@@ -116,18 +125,21 @@ def f(x):
116125

117126

118127
######################################################################
119-
# λ‚΄λΆ€μ μœΌλ‘œλŠ” νŒŒμ΄ν† μΉ˜λŠ” μ°Έμ‘°μ£ΌκΈ°λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ ν…μ„œ ``y`` λ₯Ό **νŒ¨ν‚Ή** 및 **μ–ΈνŒ¨ν‚Ή** ν–ˆμŠ΅λ‹ˆλ‹€
120-
# κ²½ν—˜μƒ, μ—­μ „νŒŒ μ €μž₯된 ν…μ„œμ— μ—‘μ„ΈμŠ€ν•˜λ©΄ μ›λž˜ ν…μ„œμ™€ λ™μΌν•œ ν…μ„œμ˜ 객체가 μƒμ„±λœλ‹€λŠ” κ²°κ³Όλ₯Ό κΈ°λŒ€ν•΄μ„œλŠ” *μ•ˆλ©λ‹ˆλ‹€.*
121-
# κ·ΈλŸ¬λ‚˜ λ™μΌν•œ *μ €μž₯μ†Œ*λ₯Ό κ³΅μœ ν•©λ‹ˆλ‹€.
128+
# λ‚΄λΆ€μ μœΌλ‘œλŠ” νŒŒμ΄ν† μΉ˜λŠ” μ°Έμ‘°μ£ΌκΈ°λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ tensor ``y`` λ₯Ό
129+
# **νŒ¨ν‚Ή** 및 **μ–ΈνŒ¨ν‚Ή** ν–ˆμŠ΅λ‹ˆλ‹€
130+
# κ²½ν—˜μƒ, μ—­μ „νŒŒ μ €μž₯된 tensor에 μ—‘μ„ΈμŠ€ν•˜λ©΄ μ›λž˜ tensor와
131+
# λ™μΌν•œ tensor의 객체가 μƒμ„±λœλ‹€λŠ” κ²°κ³Όλ₯Ό κΈ°λŒ€ν•΄μ„œλŠ” *μ•ˆλ©λ‹ˆλ‹€*.
132+
# κ·ΈλŸ¬λ‚˜ tensorλŠ” λ™μΌν•œ *μ €μž₯μ†Œ*λ₯Ό κ³΅μœ ν•©λ‹ˆλ‹€.
122133

123134
######################################################################
124-
# μ €μž₯된 ν…μ„œ hooks
135+
# μ €μž₯된 tensors hooks
125136
# -------------------
126137

127138

128139

129140
######################################################################
130-
# νŒŒμ΄ν† μΉ˜λŠ” ν…μ„œλ“€μ΄ νŒ¨ν‚Ήλ˜κ³  μ–ΈνŒ¨ν‚Ήλ˜λŠ”μ§€ μ €μž₯ν•  수 μžˆλŠ” μ‘°μ •κ°€λŠ₯ν•œ APIλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
141+
# νŒŒμ΄ν† μΉ˜λŠ” tensor듀이 μ–΄λ–»κ²Œ νŒ¨ν‚Ήλ˜κ³  μ–ΈνŒ¨ν‚Ήλ˜λŠ”μ§€
142+
# μ €μž₯ν•  수 μžˆλŠ” μ œμ–΄ κ°€λŠ₯ν•œ APIλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
131143

132144
def pack_hook(x):
133145
print("Packing", x)
@@ -146,9 +158,9 @@ def unpack_hook(x):
146158

147159

148160
######################################################################
149-
# ``pack_hook`` ν•¨μˆ˜λŠ” μž‘μ—…μ΄ μ—­μ „νŒŒλ₯Ό μœ„ν•΄ ν…μ„œλ₯Ό μ €μž₯ν•  λ•Œ λ§ˆλ‹€ ν˜ΈμΆœλ©λ‹ˆλ‹€. 그러면
150-
# ``pack_hook`` 의 좜λ ₯이 μ›λž˜ ν…μ„œ λŒ€μ‹  계산 κ·Έλž˜ν”„μ— μ €μž₯λ©λ‹ˆλ‹€.
151-
# ``unpack_hook`` 은 ν•΄λ‹Ή λ°˜ν™˜ 값을 μ‚¬μš©ν•˜μ—¬ μ—­λ°©ν–₯ 전달 쀑에 μ‹€μ œλ‘œ μ‚¬μš©λœ ν…μ„œλ₯Ό μƒˆ ν…μ„œλ‘œ κ³„μ‚°ν•©λ‹ˆλ‹€.
161+
# ``pack_hook`` ν•¨μˆ˜λŠ” μž‘μ—…μ΄ μ—­μ „νŒŒλ₯Ό μœ„ν•΄ tensorλ₯Ό μ €μž₯ν•  λ•Œ λ§ˆλ‹€ ν˜ΈμΆœλ©λ‹ˆλ‹€. 그러면
162+
# ``pack_hook`` 의 좜λ ₯이 μ›λž˜ tensor λŒ€μ‹  계산 κ·Έλž˜ν”„μ— μ €μž₯λ©λ‹ˆλ‹€.
163+
# ``unpack_hook`` 은 ν•΄λ‹Ή λ°˜ν™˜ 값을 μ‚¬μš©ν•˜μ—¬ μ—­λ°©ν–₯ 전달 쀑에 μ‹€μ œλ‘œ μ‚¬μš©λœ tensorλ₯Ό μƒˆ tensor둜 κ³„μ‚°ν•©λ‹ˆλ‹€.
152164
# 일반적으둜 ``unpack_hook(pack_hook(t))`` κ°€ ``t`` 와 κ°™κΈΈ κΈ°λŒ€ν•©λ‹ˆλ‹€.
153165

154166

@@ -160,8 +172,8 @@ def unpack_hook(x):
160172

161173

162174
######################################################################
163-
# ν•œ κ°€μ§€ μ£Όμ˜ν•  점은 ``unpack_hook`` 이 μ˜¬λ°”λ₯Έ 값을 κ°€μ§„ ν…μ„œλ₯Ό νŒŒμƒν•  수 μžˆλŠ” ν•œ
164-
# ``pack_hook`` 의 좜λ ₯은 *λͺ¨λ“  파이썬 객체* κ°€ 될 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
175+
# ν•œ κ°€μ§€ μ£Όμ˜ν•  점은 ``unpack_hook`` 이 μ˜¬λ°”λ₯Έ 값을 κ°€μ§„ tensorλ₯Ό νŒŒμƒν•  수 μžˆλŠ” ν•œ
176+
# ``pack_hook`` 의 좜λ ₯은 *any 파이썬 객체* κ°€ 될 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
165177

166178
######################################################################
167179
# λͺ‡ κ°€μ§€ νŠΉμ΄ν•œ μ˜ˆμ œλ“€
@@ -170,14 +182,13 @@ def unpack_hook(x):
170182

171183

172184
######################################################################
173-
# λ¨Όμ €, κ°€λŠ₯성을 μ„€λͺ…ν•˜κΈ° μœ„ν•΄μ„œ λͺ‡ κ°€μ§€ μ–΄λ¦¬μ„μ–΄λ³΄μ΄λŠ” μ˜ˆκ°€ μžˆμ§€λ§Œ μ•„λ§ˆ ν•˜κ³ μ‹Άμ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
185+
# λ¨Όμ €, κ°€λŠ₯은 ν•˜μ§€λ§Œ λ°”λ³΄κ°™μ•„μ„œ λˆ„κ΅¬λ„ ν•˜κ³  μ‹Άμ–΄ν•˜μ§€ μ•ŠλŠ” 예제 λͺ‡κ°€μ§€λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
174186

175187
######################################################################
176188
# **λ°˜ν™˜ 및 int**
177-
#
178-
# 파이썬 리슀트의 μΈλ±μŠ€λ°˜ν™˜
179-
#
180-
# μƒλŒ€μ μœΌλ‘œλŠ” μƒκ΄€μ—†μ§€λ§Œ λ…Όλž€μ˜ μ—¬μ§€κ°€ μžˆλŠ” μœ μš©μ„±
189+
190+
# 파이썬 리슀트의 인덱슀 λ°˜ν™˜
191+
# μƒλŒ€μ μœΌλ‘œλŠ” μœ„ν—˜ν•˜μ§„ μ•Šμ§€λ§Œ λ…Όλž€μ˜ μ—¬μ§€κ°€ μžˆλŠ” μœ μš©μ„±
181192

182193
storage = []
183194

@@ -198,7 +209,7 @@ def unpack(x):
198209
######################################################################
199210
# **νŠœν”Œμ˜ λ°˜ν™˜**
200211
#
201-
# 일뢀 ν…μ„œμ™€ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ³  압좕을 ν‘ΈλŠ” 방법은 ν˜„μž¬ ν˜•νƒœλ‘œλŠ” μœ μš©ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.
212+
# 일뢀 tensor와 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ³  νŒ¨ν‚Ήμ„ ν‘ΈλŠ” 방법은 이런 ν˜•νƒœλ‘œλŠ” μœ μš©ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.
202213

203214
def pack(x):
204215
delta = torch.randn(*x.size())
@@ -219,8 +230,8 @@ def unpack(packed):
219230
######################################################################
220231
# **str의 λ°˜ν™˜**
221232
#
222-
# ν…μ„œμ˜ __repr__ λ°˜ν™˜μ€
223-
# μ•„λ§ˆλ„ μ ˆλŒ€ μ΄λ ‡κ²Œ ν•˜μ§„ μ•Šμ„ 것!
233+
# tensor의 __repr__ λ°˜ν™˜
234+
# μ•„λ§ˆλ„ μ΄λ ‡κ²Œ ν•˜μ§€ 말 것
224235

225236
x = torch.randn(5, requires_grad=True)
226237
with torch.autograd.graph.saved_tensors_hooks(lambda x: repr(x), lambda x: eval("torch." + x)):
@@ -230,20 +241,23 @@ def unpack(packed):
230241

231242

232243
######################################################################
233-
# μ΄λŸ¬ν•œ μ˜ˆμ œλŠ” μ‹€μ œλ‘œ μœ μš©ν•˜μ§€ μ•Šμ„ κ²ƒμ΄μ§€λ§Œ ``pack_hook`` 의 좜λ ₯이 μ›λž˜ ν…μ„œμ˜ λ‚΄μš©μ„ κ²€μƒ‰ν•˜κΈ°μ— μΆ©λΆ„ν•œ 정보λ₯Ό ν¬ν•¨ν•˜λŠ” ν•œ
234-
# μ‹€μ œλ‘œ λͺ¨λ“  Python의 객체가 될 수 μžˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€.
244+
# μ΄λŸ¬ν•œ μ˜ˆμ œλŠ” μ‹€μ œλ‘œ μœ μš©ν•˜μ§€ μ•Šμ„ κ²ƒμ΄μ§€λ§Œ
245+
# μ›λž˜ tensor의 λ‚΄μš©μ„ κ°€μ Έμ˜€κΈ°μ— μΆ©λΆ„ν•œ 정보λ₯Ό κ°€μ§€κ³  μžˆλ‹€λ©΄
246+
# ``pack_hook`` 의 결과물이 μ–΄λ–€ 파이썬 객체라도
247+
# 될 수 μžˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€.
235248
# λ‹€μŒ μ„Ήμ…˜μ—μ„œλŠ” 더 μœ μš©ν•œ μ‘μš©ν”„λ‘œκ·Έλž¨μ— 쀑점을 λ‘κ² μŠ΅λ‹ˆλ‹€.
236249

237250
######################################################################
238-
# ν…μ„œλ₯Ό CPU에 μ €μž₯ν•˜κΈ°
251+
# tensorλ₯Ό CPU에 μ €μž₯ν•˜κΈ°
239252
# ~~~~~~~~~~~~~~~~~~~~~~~~
240253

241254

242255

243256
######################################################################
244-
# 맀우 λΉˆλ²ˆν•˜κ²Œ, 계산 κ·Έλž˜ν”„λ₯Ό μˆ˜λ°˜ν•˜λŠ” ν…μ„œλŠ” GPU에 μžˆμŠ΅λ‹ˆλ‹€.
245-
# κ·Έλž˜ν”„μ— μ΄λŸ¬ν•œ ν…μ„œμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μœ μ§€ν•˜λŠ” 것은 λŒ€λΆ€λΆ„μ˜ λͺ¨λΈμ΄ 평가쀑에 μ •μƒμ μœΌλ‘œ μˆ˜ν–‰λ˜μ—ˆμ„ λ•Œ
246-
# ν›ˆλ ¨μ€‘μ— GPU λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•˜κ²Œ λ§Œλ“œλŠ” 원인이 λ©λ‹ˆλ‹€.
257+
# 맀우 λΉˆλ²ˆν•˜κ²Œ, tensor 계산 κ·Έλž˜ν”„ GPU에 μ‚΄μ•„ μžˆμŠ΅λ‹ˆλ‹€.
258+
# λŒ€λΆ€λΆ„ κ²½μš°μ—μ„œ λͺ¨λΈμ΄ 평가쀑에 μ •μƒμ μœΌλ‘œ μˆ˜ν–‰λ˜μ§€λ§Œ ν›ˆλ ¨ 쀑에 λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•˜λ‹€λ©΄,
259+
# 계산 κ·Έλž˜ν”„μ—μ„œ tensor에 λŒ€ν•œ μ°Έμ‘° μœ μ§€κ°€
260+
# GPU λ©”λͺ¨λ¦¬λ₯Ό λΆ€μ‘±ν•˜κ²Œ λ§Œλ“œλŠ” 원인이 λ©λ‹ˆλ‹€.
247261
#
248262
# hooksλŠ” 이λ₯Ό κ΅¬ν˜„ν•˜λŠ” 맀우 κ°„λ‹¨ν•œ 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.
249263

@@ -265,7 +279,8 @@ def unpack_hook(packed):
265279

266280

267281
######################################################################
268-
# μ‹€μ œλ‘œ νŒŒμ΄ν† μΉ˜λŠ” μ΄λŸ¬ν•œ hooksλ₯Ό νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” APIλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. (κ³ μ •λœ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯도 포함.)
282+
# μ‹€μ œλ‘œ νŒŒμ΄ν† μΉ˜λŠ” μ΄λŸ¬ν•œ hooksλ₯Ό νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” APIλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
283+
# (κ³ μ •λœ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯도 포함).
269284

270285
import torch.nn as nn
271286

@@ -287,11 +302,11 @@ def forward(self, x):
287302

288303
######################################################################
289304
# μ‹€μ œλ‘œ A100 GPUμ—μ„œ λ°°μΉ˜ν¬κΈ°κ°€ 256인 resnet-152의 경우 μ΄λŠ” GPUλ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄
290-
# 48Gμ—μ„œ 5GB둜 6λ°° λŠλ €μ§€λŠ” λΉ„μš© κ°μ†Œμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.
305+
# 48Gμ—μ„œ 5GB둜 μ€„μ–΄λ“€μ§€λ§Œ, μ΄λŠ” 6λ°° λŠλ €μ§€λŠ” λŒ“κ°€λ₯Ό μΉ˜λ€„μ•Όν•©λ‹ˆλ‹€.
291306
#
292307
# λ¬Όλ‘  λ„€νŠΈμ›Œν¬ νŠΉμ •λΆ€λΆ„λ§Œ CPU에 μ €μž₯ν•˜μ—¬ μ ˆμΆ©μ•ˆμ„ μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
293308
#
294-
# 예λ₯Ό λ“€μ–΄, λͺ¨λ“  λͺ¨λ“ˆμ„ 감싸두고 ν•΄λ‹Ή ν…μ„œλ₯Ό CPU에 μ €μž₯ν•˜λŠ” νŠΉλ³„ν•œ
309+
# 예λ₯Ό λ“€μ–΄, μ–΄λ–€ λͺ¨λ“ˆμ„ 감싸두고 ν•΄λ‹Ή tensorλ₯Ό CPU에 μ €μž₯ν•˜λŠ” νŠΉλ³„ν•œ
295310
# ``nn.Module`` 을 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
296311

297312
class SaveToCpu(nn.Module):
@@ -315,18 +330,19 @@ def forward(self, *args, **kwargs):
315330

316331

317332
######################################################################
318-
# ν…μ„œλ₯Ό λ””μŠ€ν¬μ— μ €μž₯ν•˜κΈ°
333+
# tensorλ₯Ό λ””μŠ€ν¬μ— μ €μž₯ν•˜κΈ°
319334
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~
320335

321336

322337

323338
######################################################################
324-
# λ§ˆμ°¬κ°€μ§€λ‘œ, μ΄λŸ¬ν•œ ν…μ„œλ₯Ό λ””μŠ€ν¬μ— μ €μž₯ν•˜κ³  싢을 수 도 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ λ§ν•˜μ§€λ§Œ 이것은 μ•žμ„œλ§ν•œ hooks둜 달성할 수 μžˆμŠ΅λ‹ˆλ‹€.
339+
# λΉ„μŠ·ν•˜κ²Œ, μ΄λŸ¬ν•œ tensorλ₯Ό λ””μŠ€ν¬μ— μ €μž₯ν•˜κ³  싢을 수 도 μžˆμŠ΅λ‹ˆλ‹€.
340+
# λ‹€μ‹œ λ§ν•˜μ§€λ§Œ 이것은 μ•žμ„œλ§ν•œ hooks둜 달성할 수 μžˆμŠ΅λ‹ˆλ‹€.
325341

326342
######################################################################
327-
# λ‹¨μˆœν•œ λ²„μ „μ˜ μ•„λ§ˆ μ΄λŸ΄κ²ƒμž…λ‹ˆλ‹€.
343+
# λͺ¨μžλž€ 버전은 보톡 μ΄λŸ΄κ²ƒμž…λ‹ˆλ‹€.
328344
#
329-
# λ‹¨μˆœλ²„μ „ - 힌트: μ΄λ ‡κ²Œ ν•˜μ§€ λ§ˆμ‹œμ˜€.
345+
# λͺ¨μžλž€ 버전(naive version) - 힌트: μ΄λ ‡κ²Œ ν•˜μ§€ λ§ˆμ‹œμ˜€.
330346

331347
import uuid
332348
tmp_dir = "temp"
@@ -365,7 +381,7 @@ def unpack_hook(name):
365381

366382
######################################################################
367383
# μœ„μ˜ μ½”λ“œκ°€ μž‘λ™ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” ``unpack_hook`` κ°€ μ—¬λŸ¬λ²ˆ 호좜되기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
368-
# λ¨Όμ € 압좕을 ν’€ λ•Œ νŒŒμΌμ„ μ‚­μ œν•˜λ©΄ μ²˜μŒμ—, μ €μž₯된 ν…μ„œμ— μ—‘μ„ΈμŠ€μ‹œμ— μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
384+
# λ¨Όμ € 압좕을 ν’€ λ•Œ νŒŒμΌμ„ μ‚­μ œν•˜λ©΄ μ²˜μŒμ—, μ €μž₯된 tensor에 μ ‘κ·Όμ‹œμ— μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
369385
# 두 λ²ˆμ§Έμ—λŠ” 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
370386

371387
x = torch.ones(5, requires_grad=True)
@@ -380,8 +396,9 @@ def unpack_hook(name):
380396

381397

382398
######################################################################
383-
# 이문제λ₯Ό ν•΄κ²°ν•˜κΈ°μœ„ν•΄ 이점을 ν™œμš©ν•˜λŠ” hooks의 버전을 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
384-
# νŒŒμ΄ν† μΉ˜κ°€ μ €μž₯된 데이터λ₯Ό μžλ™μœΌλ‘œ ν•΄μ œ(μ‚­μ œ)ν•œλ‹€λŠ” 사싀이 더이상 ν•„μš”ν•˜μ§€ μ•Šμ„ λ•Œμž…λ‹ˆλ‹€.
399+
# 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄,
400+
# νŒŒμ΄ν† μΉ˜λŠ” μ €μž₯된 데이터λ₯Ό 더이상 ν•„μš”ν•˜μ§€ μ•Šμ„ λ•Œ
401+
# μžλ™μœΌλ‘œ ν•΄μ œ(μ‚­μ œ) ν•˜λŠ” 이점을 ν™œμš©ν•˜λŠ” hooks의 버전을 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
385402

386403
class SelfDeletingTempFile():
387404
def __init__(self):
@@ -405,7 +422,7 @@ def unpack_hook(temp_file):
405422
#
406423
# λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ λͺ¨λΈμ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
407424

408-
# μ‚¬μ΄μ¦ˆ >=1000인 ν…μ„œλ§Œμ΄ λ””μŠ€ν¬μ— μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.
425+
# μ‚¬μ΄μ¦ˆ >=1000인 tensor만이 λ””μŠ€ν¬μ— μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.
409426

410427
SAVE_ON_DISK_THRESHOLD = 1000
411428

@@ -434,10 +451,11 @@ def forward(self, *args, **kwargs):
434451

435452

436453
######################################################################
437-
# 이 λ§ˆμ§€λ§‰ μ˜ˆμ œμ—μ„œλŠ” μ €μž₯ν•΄μ•Ό ν•˜λŠ” (μ—¬κΈ°μ—μ„œλŠ” μ›μ†Œμ˜ μˆ˜κ°€ 1000 이상인) ν…μ„œλ“€μ„ κ³¨λΌλ‚΄λŠ” 방법과
454+
# 이 λ§ˆμ§€λ§‰ μ˜ˆμ œμ—μ„œλŠ” μ €μž₯ν•΄μ•Ό ν•˜λŠ” (μ—¬κΈ°μ—μ„œλŠ” μ›μ†Œμ˜ μˆ˜κ°€ 1000 이상인) tensor듀을 κ³¨λΌλ‚΄λŠ” 방법과
438455
# 이 κΈ°λŠ₯을 ``nn.DataParallel`` κ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.
439456

440457

441458
######################################################################
442459
# μ—¬κΈ°κΉŒμ§€ 잘 λ”°λΌμ˜€μ…¨λ‚˜μš”? μΆ•ν•˜ν•©λ‹ˆλ‹€!
443-
# 이제 μ €μž₯된 ν…μ„œ hooks을 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€μ™€ μ—°μ‚° μ‹œ λ©”λͺ¨λ¦¬ 관리(trade-offs)에 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” 방법을 μ•Œκ²Œ λ˜μ…¨μŠ΅λ‹ˆλ‹€.
460+
# 이제 μ €μž₯된 tensor hooksλ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€μ™€
461+
# μ—°μ‚° μ‹œ λ©”λͺ¨λ¦¬ 관리(trade-offs)에 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” 방법을 μ•Œκ²Œ λ˜μ…¨μŠ΅λ‹ˆλ‹€.

0 commit comments

Comments
Β (0)