Skip to content

Commit b04d1f5

Browse files
committed
Update translation: lectures/jax_intro.md
1 parent 3b253f7 commit b04d1f5

1 file changed

Lines changed: 33 additions & 14 deletions

File tree

lectures/jax_intro.md

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ translation:
2424
JAX as a NumPy Replacement::Differences::A Workaround: راه‌حل جایگزین
2525
Functional Programming: برنامه‌نویسی تابعی
2626
Functional Programming::Pure functions: توابع خالص
27-
Functional Programming::Examples: مثال‌ها
27+
Functional Programming::Examples -- Pure and Impure: مثال‌ها -- خالص و ناخالص
2828
Functional Programming::Why Functional Programming?: چرا برنامه‌نویسی تابعی؟
2929
Random numbers: اعداد تصادفی
3030
Random numbers::NumPy / MATLAB Approach: رویکرد NumPy / MATLAB
@@ -356,19 +356,20 @@ a
356356
* وضعیت سراسری را تغییر نمی‌دهد
357357
* داده‌های ارسال شده به تابع را تغییر نمی‌دهد (داده‌های تغییرناپذیر)
358358

359-
### مثال‌ها
359+
### مثال‌ها -- خالص و ناخالص
360360

361-
در اینجا مثالی از یک تابع *غیرخالص* آورده شده است
361+
در اینجا مثالی از یک تابع *ناخالص* آورده شده است
362362

363363
```{code-cell} ipython3
364364
tax_rate = 0.1
365-
prices = [10.0, 20.0]
366365
367366
def add_tax(prices):
368367
for i, price in enumerate(prices):
369368
prices[i] = price * (1 + tax_rate)
370-
print('Post-tax prices: ', prices)
371-
return prices
369+
370+
prices = [10.0, 20.0]
371+
add_tax(prices)
372+
prices
372373
```
373374

374375
این تابع نمی‌تواند خالص باشد زیرا
@@ -379,15 +380,21 @@ def add_tax(prices):
379380
در اینجا یک نسخه *خالص* آورده شده است
380381

381382
```{code-cell} ipython3
382-
tax_rate = 0.1
383-
prices = (10.0, 20.0)
384383
385384
def add_tax_pure(prices, tax_rate):
386385
new_prices = [price * (1 + tax_rate) for price in prices]
387386
return new_prices
387+
388+
tax_rate = 0.1
389+
prices = (10.0, 20.0)
390+
after_tax_prices = add_tax_pure(prices, tax_rate)
391+
after_tax_prices
388392
```
389393

390-
این نسخه خالص تمام وابستگی‌ها را از طریق آرگومان‌های تابع صریح می‌کند و هیچ وضعیت خارجی را تغییر نمی‌دهد.
394+
این نسخه خالص است زیرا
395+
396+
* تمام وابستگی‌ها از طریق آرگومان‌های تابع صریح هستند
397+
* و هیچ وضعیت خارجی را تغییر نمی‌دهد
391398

392399
### چرا برنامه‌نویسی تابعی؟
393400

@@ -437,7 +444,7 @@ print(np.random.randn(2))
437444
* غیرقطعی است: ورودی‌های یکسان، خروجی‌های متفاوت
438445
* دارای عوارض جانبی است: وضعیت مولد اعداد تصادفی سراسری را تغییر می‌دهد
439446

440-
در موازی‌سازی خطرناک است --- باید با دقت کنترل کرد که در هر رشته چه اتفاقی می‌افتد!
447+
این در موازی‌سازی خطرناک است --- باید با دقت کنترل کرد که در هر رشته چه اتفاقی می‌افتد.
441448

442449
### JAX
443450

@@ -554,7 +561,11 @@ plt.show()
554561
تابع زیر `k` ماتریس تصادفی `n x n` (شبه) مستقل را با استفاده از `split` تولید می‌کند.
555562

556563
```{code-cell} ipython3
557-
def gen_random_matrices(key, n=2, k=3):
564+
def gen_random_matrices(
565+
key, # JAX key for random numbers
566+
n=2, # Matrices will be n x n
567+
k=3 # Number of matrices to generate
568+
):
558569
matrices = []
559570
for _ in range(k):
560571
key, subkey = jax.random.split(key)
@@ -576,7 +587,7 @@ gen_random_matrices(key)
576587

577588
### مزایا
578589

579-
صریح بودن JAX مزایای قابل توجهی به همراه دارد:
590+
همان‌طور که در بالا ذکر شد، این صراحت ارزشمند است:
580591

581592
* تکرارپذیری: با استفاده مجدد از کلیدها، تکرار نتایج آسان است
582593
* موازی‌سازی: کنترل آنچه در رشته‌های جداگانه اتفاق می‌افتد
@@ -657,7 +668,14 @@ with qe.Timer():
657668

658669
نتیجه مشابه مثال `cos` است --- JAX سریع‌تر است، به ویژه در اجرای دوم پس از کامپایل JIT.
659670

660-
اما همچنان از اجرای eager استفاده می‌کنیم --- حافظه و خواندن/نوشتن زیاد.
671+
این به این دلیل است که عملیات‌های آرایه‌ای منفرد روی GPU موازی‌سازی می‌شوند.
672+
673+
اما همچنان از اجرای eager استفاده می‌کنیم
674+
675+
* حافظه زیاد به دلیل آرایه‌های میانی
676+
* خواندن/نوشتن حافظه زیاد
677+
678+
همچنین، هسته‌های جداگانه زیادی روی GPU راه‌اندازی می‌شوند.
661679

662680
### کامپایل کل تابع
663681

@@ -691,7 +709,8 @@ with qe.Timer():
691709

692710
* بهینه‌سازی تهاجمی بر اساس کل دنباله محاسباتی
693711
* حذف چندین فراخوانی به شتاب‌دهنده سخت‌افزاری
694-
* عدم ایجاد آرایه‌های میانی
712+
713+
ردپای حافظه نیز بسیار کمتر است --- عدم ایجاد آرایه‌های میانی.
695714

696715
اتفاقاً، نحو رایج‌تر هنگام هدف قرار دادن یک تابع برای کامپایلر JIT این است
697716

0 commit comments

Comments
 (0)