You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: lectures/jax_intro.md
+34-24Lines changed: 34 additions & 24 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -18,9 +18,10 @@ translation:
18
18
JAX as a NumPy Replacement::Differences::Speed!: سرعت!
19
19
JAX as a NumPy Replacement::Differences::Speed!::With NumPy: با NumPy
20
20
JAX as a NumPy Replacement::Differences::Speed!::With JAX: با JAX
21
+
JAX as a NumPy Replacement::Differences::Size Experiment: آزمایش اندازه
21
22
JAX as a NumPy Replacement::Differences::Precision: دقت
22
23
JAX as a NumPy Replacement::Differences::Immutability: تغییرناپذیری
23
-
JAX as a NumPy Replacement::Differences::A workaround: راهحل جایگزین
24
+
JAX as a NumPy Replacement::Differences::A Workaround: راهحل جایگزین
24
25
Functional Programming: برنامهنویسی تابعی
25
26
Functional Programming::Pure functions: توابع خالص
26
27
Functional Programming::Examples: مثالها
@@ -76,18 +77,18 @@ import numpy as np
76
77
import quantecon as qe
77
78
```
78
79
79
-
توجه کنید که `jax.numpy as jnp` را import میکنیم که یک رابط شبیه NumPy فراهم میکند.
80
-
81
80
## JAX به عنوان جایگزین NumPy
82
81
83
-
یکی از ویژگیهای جذاب JAX این است که، هر زمان که امکانپذیر باشد، عملیات پردازش آرایههای آن با API NumPy مطابقت دارد.
84
-
85
-
این بدان معناست که در بسیاری از موارد، میتوانیم از JAX به عنوان جایگزین مستقیم NumPy استفاده کنیم.
86
-
87
82
بیایید به شباهتها و تفاوتهای بین JAX و NumPy نگاه کنیم.
88
83
89
84
### شباهتها
90
85
86
+
در بالا `jax.numpy as jnp` را وارد کردیم که یک رابط شبیه به NumPy برای عملیات آرایه فراهم میکند.
87
+
88
+
یکی از ویژگیهای جذاب JAX این است که، هر زمان که امکانپذیر باشد، این رابط با API NumPy مطابقت دارد.
89
+
90
+
در نتیجه، اغلب میتوانیم از JAX به عنوان جایگزین مستقیم NumPy استفاده کنیم.
91
+
91
92
در اینجا برخی عملیات استاندارد آرایه با استفاده از `jnp` آمده است:
92
93
93
94
```{code-cell} ipython3
@@ -106,7 +107,7 @@ print(jnp.sum(a))
106
107
print(jnp.dot(a, a))
107
108
```
108
109
109
-
با این حال، شیء آرایه `a` یک آرایه NumPy نیست:
110
+
با این حال، باید به خاطر داشت که شیء آرایه `a` یک آرایه NumPy نیست:
110
111
111
112
```{code-cell} ipython3
112
113
a
@@ -129,11 +130,13 @@ jnp.sum(a)
129
130
(jax_speed)=
130
131
#### سرعت!
131
132
132
-
فرض کنیم میخواهیم تابع کسینوس را در نقاط بسیاری ارزیابی کنیم.
133
+
یکی از تفاوتهای عمده این است که JAX سریعتر است --- و گاهی بسیار سریعتر.
134
+
135
+
برای نشان دادن این موضوع، فرض کنیم میخواهیم تابع کسینوس را در نقاط بسیاری ارزیابی کنیم.
133
136
134
137
```{code-cell}
135
138
n = 50_000_000
136
-
x = np.linspace(0, 10, n)
139
+
x = np.linspace(0, 10, n) # NumPy array
137
140
```
138
141
139
142
##### با NumPy
@@ -174,27 +177,23 @@ with qe.Timer():
174
177
# First run
175
178
y = jnp.cos(x)
176
179
# Hold the interpreter until the array operation finishes
177
-
jax.block_until_ready(y);
180
+
y.block_until_ready()
178
181
```
179
182
180
183
```{note}
181
-
در اینجا، برای اندازهگیری سرعت واقعی، از متد `block_until_ready` استفاده میکنیم
182
-
تا مفسر را تا زمانی که نتایج محاسبات بازگردانده شوند نگه داریم.
183
-
184
-
این ضروری است زیرا JAX از ارسال ناهمزمان استفاده میکند که
184
+
در بالا، متد `block_until_ready` مفسر را تا زمانی که نتایج محاسبات بازگردانده شوند نگه میدارد.
185
+
این برای زمانبندی اجرا ضروری است زیرا JAX از ارسال ناهمزمان استفاده میکند که
185
186
به مفسر Python اجازه میدهد جلوتر از محاسبات عددی حرکت کند.
186
-
187
-
برای کدهایی که زمانبندی نمیشوند، میتوانید خط حاوی `block_until_ready` را حذف کنید.
188
187
```
189
188
190
-
و بیایید دوباره زمانبندی کنیم.
189
+
اکنون بیایید دوباره زمانبندی کنیم.
191
190
192
191
```{code-cell}
193
192
with qe.Timer():
194
193
# Second run
195
194
y = jnp.cos(x)
196
195
# Hold interpreter
197
-
jax.block_until_ready(y);
196
+
y.block_until_ready()
198
197
```
199
198
200
199
روی GPU، این کد بسیار سریعتر از معادل NumPy خود اجرا میشود.
@@ -209,6 +208,8 @@ with qe.Timer():
209
208
210
209
اندازه برای تولید کد بهینه اهمیت دارد زیرا موازیسازی کارآمد نیازمند تطابق اندازه کار با سختافزار موجود است.
211
210
211
+
#### آزمایش اندازه
212
+
212
213
میتوانیم ادعا که JAX بر اندازه آرایه تخصص پیدا میکند را با تغییر اندازه ورودی و مشاهده زمانهای اجرا تأیید کنیم.
213
214
214
215
```{code-cell}
@@ -220,15 +221,15 @@ with qe.Timer():
220
221
# First run
221
222
y = jnp.cos(x)
222
223
# Hold interpreter
223
-
jax.block_until_ready(y);
224
+
y.block_until_ready()
224
225
```
225
226
226
227
```{code-cell}
227
228
with qe.Timer():
228
229
# Second run
229
230
y = jnp.cos(x)
230
231
# Hold interpreter
231
-
jax.block_until_ready(y);
232
+
y.block_until_ready()
232
233
```
233
234
234
235
زمان اجرا افزایش مییابد و سپس دوباره کاهش مییابد (این روی GPU واضحتر خواهد بود).
@@ -277,7 +278,7 @@ a[0] = 1
277
278
a
278
279
```
279
280
280
-
در JAX این کار شکست میخورد!
281
+
در JAX این کار شکست میخورد 😱.
281
282
282
283
```{code-cell} ipython3
283
284
a = jnp.linspace(0, 1, 3)
@@ -292,11 +293,18 @@ except Exception as e:
292
293
293
294
```
294
295
295
-
طراحان JAX تصمیم گرفتند آرایهها را تغییرناپذیر کنند زیرا JAX از سبک برنامهنویسی تابعی استفاده میکند که در ادامه آن را بررسی میکنیم.
296
+
طراحان JAX تصمیم گرفتند آرایهها را تغییرناپذیر کنند زیرا
296
297
298
+
1. JAX از *سبک برنامهنویسی تابعی* استفاده میکند و
299
+
2. برنامهنویسی تابعی معمولاً از دادههای قابل تغییر اجتناب میکند
300
+
301
+
این ایدهها را {ref}`در ادامه <jax_func>` بررسی میکنیم.
302
+
303
+
304
+
(jax_at_workaround)=
297
305
#### راهحل جایگزین
298
306
299
-
توجه میکنیم که JAX یک جایگزین برای تغییر درجای آرایه با استفاده از[متد `at`](https://docs.jax.dev/en/latest/_autosummary/jax.numpy.ndarray.at.html) فراهم میکند.
307
+
JAX یک جایگزین مستقیم برای تغییر درجای آرایه از طریق[متد `at`](https://docs.jax.dev/en/latest/_autosummary/jax.numpy.ndarray.at.html) فراهم میکند.
300
308
301
309
```{code-cell} ipython3
302
310
a = jnp.linspace(0, 1, 3)
@@ -318,6 +326,8 @@ a
318
326
319
327
(اگرچه در واقع میتواند داخل توابع کامپایلشده JIT کارآمد باشد -- اما بیایید این را فعلاً کنار بگذاریم.)
0 commit comments