Skip to content

Commit 970accf

Browse files
committed
Update translation: lectures/jax_intro.md
1 parent 0fe603e commit 970accf

1 file changed

Lines changed: 34 additions & 24 deletions

File tree

lectures/jax_intro.md

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ translation:
1818
JAX as a NumPy Replacement::Differences::Speed!: سرعت!
1919
JAX as a NumPy Replacement::Differences::Speed!::With NumPy: با NumPy
2020
JAX as a NumPy Replacement::Differences::Speed!::With JAX: با JAX
21+
JAX as a NumPy Replacement::Differences::Size Experiment: آزمایش اندازه
2122
JAX as a NumPy Replacement::Differences::Precision: دقت
2223
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: راه‌حل جایگزین
2425
Functional Programming: برنامه‌نویسی تابعی
2526
Functional Programming::Pure functions: توابع خالص
2627
Functional Programming::Examples: مثال‌ها
@@ -76,18 +77,18 @@ import numpy as np
7677
import quantecon as qe
7778
```
7879

79-
توجه کنید که `jax.numpy as jnp` را import می‌کنیم که یک رابط شبیه NumPy فراهم می‌کند.
80-
8180
## JAX به عنوان جایگزین NumPy
8281

83-
یکی از ویژگی‌های جذاب JAX این است که، هر زمان که امکان‌پذیر باشد، عملیات پردازش آرایه‌های آن با API NumPy مطابقت دارد.
84-
85-
این بدان معناست که در بسیاری از موارد، می‌توانیم از JAX به عنوان جایگزین مستقیم NumPy استفاده کنیم.
86-
8782
بیایید به شباهت‌ها و تفاوت‌های بین JAX و NumPy نگاه کنیم.
8883

8984
### شباهت‌ها
9085

86+
در بالا `jax.numpy as jnp` را وارد کردیم که یک رابط شبیه به NumPy برای عملیات آرایه فراهم می‌کند.
87+
88+
یکی از ویژگی‌های جذاب JAX این است که، هر زمان که امکان‌پذیر باشد، این رابط با API NumPy مطابقت دارد.
89+
90+
در نتیجه، اغلب می‌توانیم از JAX به عنوان جایگزین مستقیم NumPy استفاده کنیم.
91+
9192
در اینجا برخی عملیات استاندارد آرایه با استفاده از `jnp` آمده است:
9293

9394
```{code-cell} ipython3
@@ -106,7 +107,7 @@ print(jnp.sum(a))
106107
print(jnp.dot(a, a))
107108
```
108109

109-
با این حال، شیء آرایه `a` یک آرایه NumPy نیست:
110+
با این حال، باید به خاطر داشت که شیء آرایه `a` یک آرایه NumPy نیست:
110111

111112
```{code-cell} ipython3
112113
a
@@ -129,11 +130,13 @@ jnp.sum(a)
129130
(jax_speed)=
130131
#### سرعت!
131132

132-
فرض کنیم می‌خواهیم تابع کسینوس را در نقاط بسیاری ارزیابی کنیم.
133+
یکی از تفاوت‌های عمده این است که JAX سریع‌تر است --- و گاهی بسیار سریع‌تر.
134+
135+
برای نشان دادن این موضوع، فرض کنیم می‌خواهیم تابع کسینوس را در نقاط بسیاری ارزیابی کنیم.
133136

134137
```{code-cell}
135138
n = 50_000_000
136-
x = np.linspace(0, 10, n)
139+
x = np.linspace(0, 10, n) # NumPy array
137140
```
138141

139142
##### با NumPy
@@ -174,27 +177,23 @@ with qe.Timer():
174177
# First run
175178
y = jnp.cos(x)
176179
# Hold the interpreter until the array operation finishes
177-
jax.block_until_ready(y);
180+
y.block_until_ready()
178181
```
179182

180183
```{note}
181-
در اینجا، برای اندازه‌گیری سرعت واقعی، از متد `block_until_ready` استفاده می‌کنیم
182-
تا مفسر را تا زمانی که نتایج محاسبات بازگردانده شوند نگه داریم.
183-
184-
این ضروری است زیرا JAX از ارسال ناهمزمان استفاده می‌کند که
184+
در بالا، متد `block_until_ready` مفسر را تا زمانی که نتایج محاسبات بازگردانده شوند نگه می‌دارد.
185+
این برای زمان‌بندی اجرا ضروری است زیرا JAX از ارسال ناهمزمان استفاده می‌کند که
185186
به مفسر Python اجازه می‌دهد جلوتر از محاسبات عددی حرکت کند.
186-
187-
برای کدهایی که زمان‌بندی نمی‌شوند، می‌توانید خط حاوی `block_until_ready` را حذف کنید.
188187
```
189188

190-
و بیایید دوباره زمان‌بندی کنیم.
189+
اکنون بیایید دوباره زمان‌بندی کنیم.
191190

192191
```{code-cell}
193192
with qe.Timer():
194193
# Second run
195194
y = jnp.cos(x)
196195
# Hold interpreter
197-
jax.block_until_ready(y);
196+
y.block_until_ready()
198197
```
199198

200199
روی GPU، این کد بسیار سریع‌تر از معادل NumPy خود اجرا می‌شود.
@@ -209,6 +208,8 @@ with qe.Timer():
209208

210209
اندازه برای تولید کد بهینه اهمیت دارد زیرا موازی‌سازی کارآمد نیازمند تطابق اندازه کار با سخت‌افزار موجود است.
211210

211+
#### آزمایش اندازه
212+
212213
می‌توانیم ادعا که JAX بر اندازه آرایه تخصص پیدا می‌کند را با تغییر اندازه ورودی و مشاهده زمان‌های اجرا تأیید کنیم.
213214

214215
```{code-cell}
@@ -220,15 +221,15 @@ with qe.Timer():
220221
# First run
221222
y = jnp.cos(x)
222223
# Hold interpreter
223-
jax.block_until_ready(y);
224+
y.block_until_ready()
224225
```
225226

226227
```{code-cell}
227228
with qe.Timer():
228229
# Second run
229230
y = jnp.cos(x)
230231
# Hold interpreter
231-
jax.block_until_ready(y);
232+
y.block_until_ready()
232233
```
233234

234235
زمان اجرا افزایش می‌یابد و سپس دوباره کاهش می‌یابد (این روی GPU واضح‌تر خواهد بود).
@@ -277,7 +278,7 @@ a[0] = 1
277278
a
278279
```
279280

280-
در JAX این کار شکست می‌خورد!
281+
در JAX این کار شکست می‌خورد 😱.
281282

282283
```{code-cell} ipython3
283284
a = jnp.linspace(0, 1, 3)
@@ -292,11 +293,18 @@ except Exception as e:
292293
293294
```
294295

295-
طراحان JAX تصمیم گرفتند آرایه‌ها را تغییرناپذیر کنند زیرا JAX از سبک برنامه‌نویسی تابعی استفاده می‌کند که در ادامه آن را بررسی می‌کنیم.
296+
طراحان JAX تصمیم گرفتند آرایه‌ها را تغییرناپذیر کنند زیرا
296297

298+
1. JAX از *سبک برنامه‌نویسی تابعی* استفاده می‌کند و
299+
2. برنامه‌نویسی تابعی معمولاً از داده‌های قابل تغییر اجتناب می‌کند
300+
301+
این ایده‌ها را {ref}`در ادامه <jax_func>` بررسی می‌کنیم.
302+
303+
304+
(jax_at_workaround)=
297305
#### راه‌حل جایگزین
298306

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) فراهم می‌کند.
300308

301309
```{code-cell} ipython3
302310
a = jnp.linspace(0, 1, 3)
@@ -318,6 +326,8 @@ a
318326

319327
(اگرچه در واقع می‌تواند داخل توابع کامپایل‌شده JIT کارآمد باشد -- اما بیایید این را فعلاً کنار بگذاریم.)
320328

329+
330+
(jax_func)=
321331
## برنامه‌نویسی تابعی
322332

323333
از مستندات JAX:

0 commit comments

Comments
 (0)