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
Vectorized operations::A Comparison with Numba: مقایسه با Numba
17
18
Vectorized operations::Parallelized Numba: Numba موازی شده
18
19
Vectorized operations::Vectorized code with JAX: کد برداری شده با JAX
@@ -146,16 +147,33 @@ for x in grid:
146
147
147
148
بیایید به NumPy تغییر دهیم و از یک شبکه بزرگتر استفاده کنیم
148
149
150
+
```{code-cell} ipython3
151
+
grid = np.linspace(-3, 3, 3_000) # Large grid
152
+
```
153
+
154
+
به عنوان اولین گام برداریسازی ممکن است چیزی شبیه به این امتحان کنیم
155
+
156
+
```{code-cell} ipython3
157
+
# Large grid
158
+
z = np.max(f(grid, grid)) # This is wrong!
159
+
```
160
+
161
+
مشکل اینجا این است که `f(grid, grid)` از حلقه تودرتو پیروی نمیکند.
162
+
163
+
از نظر شکل بالا، این کد فقط مقادیر `f` را روی قطر محاسبه میکند.
164
+
165
+
برای اینکه NumPy را مجبور کنیم `f(x,y)` را روی هر جفت `x,y` محاسبه کند، باید از `np.meshgrid` استفاده کنیم.
166
+
149
167
در اینجا از `np.meshgrid` برای ایجاد شبکههای ورودی دوبعدی `x` و `y` استفاده میکنیم به گونهای که `f(x, y)` تمام ارزیابیها را روی شبکه حاصلضرب تولید میکند.
150
168
151
169
```{code-cell} ipython3
152
170
# Large grid
153
171
grid = np.linspace(-3, 3, 3_000)
154
172
155
-
x, y = np.meshgrid(grid, grid) # MATLAB style meshgrid
مانند Numba، فقط از آرایه تخت `grid` استفاده میکنیم.
372
+
347
373
و چون همه چیز زیر یک `@jax.jit` واحد قرار دارد، کامپایلر میتواند تمام عملیات را در یک kernel بهینه ادغام کند.
348
374
349
375
بیایید آن را امتحان کنیم.
@@ -374,13 +400,11 @@ with qe.Timer():
374
400
375
401
هم از نظر سرعت (از طریق JIT-compilation و موازیسازی) و هم از نظر کارایی حافظه (از طریق vmap) بر NumPy غلبه میکند.
376
402
377
-
علاوه بر این، رویکرد `vmap` گاهی اوقات میتواند منجر به کد به طور قابل توجهی واضحتری شود.
403
+
همچنین هنگام اجرا روی GPU بر Numba نیز غلبه میکند.
378
404
379
-
در حالی که Numba چشمگیر است، زیبایی JAX این است که با عملیات کاملاً برداری شده، میتوانیم دقیقاً همان کد را روی دستگاههای با شتابدهنده سختافزاری اجرا کنیم و بدون تلاش اضافی از تمام مزایا بهرهمند شویم.
380
-
381
-
علاوه بر این، JAX قبلاً میداند چگونه بسیاری از عملیات آرایه رایج را به طور مؤثر موازی کند، که کلید اجرای سریع است.
382
-
383
-
برای اکثر موارد مواجه شده در اقتصاد، اقتصادسنجی و امور مالی، بسیار بهتر است که برای موازیسازی کارآمد به کامپایلر JAX تحویل دهیم تا اینکه سعی کنیم این روالها را خودمان کدنویسی دستی کنیم.
405
+
```{note}
406
+
Numba میتواند برنامهنویسی GPU را از طریق `numba.cuda` پشتیبانی کند، اما در آن صورت باید موازیسازی را به صورت دستی انجام دهیم. برای اکثر موارد مواجه شده در اقتصاد، اقتصادسنجی و امور مالی، بسیار بهتر است که برای موازیسازی کارآمد به کامپایلر JAX تحویل دهیم تا اینکه سعی کنیم این روالها را خودمان به صورت دستی کدنویسی کنیم.
407
+
```
384
408
385
409
## عملیات ترتیبی
386
410
@@ -530,8 +554,6 @@ with qe.Timer():
530
554
531
555
در حالی که سینتکس `at[t].set` در JAX بهروزرسانی عنصر به عنصر را ممکن میسازد، کد کلی همچنان سختتر از معادل Numba برای خواندن است.
532
556
533
-
برای این نوع عملیات ترتیبی، Numba برنده واضح از نظر وضوح کد و سهولت پیادهسازی است.
534
-
535
557
## توصیههای کلی
536
558
537
559
حال قدمی به عقب بر میداریم و مبادلات را خلاصه میکنیم.
@@ -544,17 +566,12 @@ with qe.Timer():
544
566
545
567
علاوه بر این، توابع JAX بهصورت خودکار مشتقپذیر هستند، همانطور که در {doc}`autodiff` بررسی میکنیم.
546
568
547
-
برای **عملیات ترتیبی**، Numba مزایای آشکاری دارد.
569
+
برای **عملیات ترتیبی**، Numba نحو بهتری دارد.
548
570
549
571
کد طبیعی و خوانا است --- صرفاً یک حلقه پایتون با یک decorator --- و کارایی آن عالی است.
550
572
551
573
JAX میتواند مسائل ترتیبی را از طریق `lax.fori_loop` یا `lax.scan` مدیریت کند، اما نحو آن کمتر شهودی است.
552
574
553
-
```{note}
554
-
یک مزیت مهم `lax.fori_loop` و `lax.scan` این است که از مشتقگیری خودکار در طول حلقه پشتیبانی میکنند، که Numba قادر به انجام آن نیست.
555
-
اگر نیاز دارید از طریق یک محاسبه ترتیبی مشتق بگیرید (مثلاً محاسبه حساسیتهای یک مسیر نسبت به پارامترهای مدل)، JAX علیرغم نحو کمتر طبیعیاش، انتخاب بهتری است.
556
-
```
557
-
558
-
در عمل، بسیاری از مسائل ترکیبی از هر دو الگو هستند.
575
+
از سوی دیگر، نسخههای JAX از مشتقگیری خودکار پشتیبانی میکنند.
559
576
560
-
یک قاعده سرانگشتی مناسب: برای پروژههای جدید، بهویژه زمانی که شتابدهی سختافزاری یا مشتقپذیری ممکن است مفید باشد، بهطور پیشفرض از JAX استفاده کنید، و هنگامی که یک حلقه ترتیبی فشرده نیاز به سرعت و خوانایی دارد، به Numba متوسل شوید.
577
+
این ممکن است جالب توجه باشد اگر، برای مثال، بخواهیم حساسیتهای یک مسیر را نسبت به پارامترهای مدل محاسبه کنیم.
0 commit comments