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/need_for_speed.md
+32-73Lines changed: 32 additions & 73 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -59,7 +59,7 @@ translation:
59
59
60
60
## مرور کلی
61
61
62
-
احتمالاً میتوان با اطمینان گفت که پایتون محبوبترین زبان برای محاسبات علمی است.
62
+
پایتون محبوبترین زبان برای بسیاری از جنبههای محاسبات علمی است.
63
63
64
64
این به دلیل موارد زیر است:
65
65
@@ -98,35 +98,36 @@ import matplotlib.pyplot as plt
98
98
import random
99
99
```
100
100
101
-
102
101
## کتابخانههای علمی اصلی
103
102
104
103
بیایید به طور خلاصه کتابخانههای علمی پایتون را مرور کنیم.
105
104
106
-
107
105
### چرا به آنها نیاز داریم؟
108
106
109
-
یکی از دلایل استفاده از کتابخانههای علمی این است که آنها روالهایی را که میخواهیم استفاده کنیم، پیادهسازی میکنند.
107
+
ما به کتابخانههای علمی پایتون به دو دلیل نیاز داریم:
110
108
111
-
* انتگرالگیری عددی، درونیابی، جبر خطی، یافتن ریشه و غیره.
109
+
1. پایتون کوچک است
110
+
2. پایتون کند است
112
111
113
-
به عنوان مثال، معمولاً بهتر است از یک روال موجود برای یافتن ریشه استفاده کنیم تا اینکه از ابتدا یک روال جدید بنویسیم.
112
+
**پایتون کوچک است**
114
113
115
-
(برای الگوریتمهای استاندارد، کارایی زمانی به حداکثر میرسد که جامعه بتواند در یک مجموعه مشترک از پیادهسازیها هماهنگ شود، که توسط متخصصان نوشته شده و توسط کاربران برای سریع و قوی بودن تا حد ممکن تنظیم شدهاند!)
114
+
هسته پایتون به طور عمدی کوچک طراحی شده است -- این به بهینهسازی، دسترسیپذیری و نگهداری کمک میکند.
116
115
117
-
اما این تنها دلیلی نیست که ما از کتابخانههای علمی پایتون استفاده میکنیم.
116
+
کتابخانههای علمی روالهایی را فراهم میکنند که نمیخواهیم -- و احتمالاً نباید -- خودمان بنویسیم.
118
117
119
-
دلیل دیگر این است که پایتون خالص سریع نیست.
118
+
* انتگرالگیری عددی، درونیابی، جبر خطی، یافتن ریشه و غیره.
120
119
121
-
بنابراین به کتابخانههایی نیاز داریم که برای تسریع اجرای کد پایتون طراحی شدهاند.
120
+
**پایتون کند است**
122
121
123
-
آنها این کار را با استفاده از دو استراتژی انجام میدهند:
122
+
دلیل دیگری که به کتابخانههای علمی نیاز داریم این است که پایتون خالص نسبتاً کند است.
124
123
125
-
1. استفاده از کامپایلرهایی که دستورات شبیه پایتون را به کد ماشین سریع برای رشتههای منفرد منطقی تبدیل میکنند و
126
-
2. موازیسازی وظایف در چندین "کارگر" (به عنوان مثال، CPUها، رشتههای منفرد داخل GPUها).
124
+
کتابخانههای علمی اجرا را با استفاده از سه استراتژی اصلی تسریع میکنند:
127
125
128
-
ما این ایدهها را به طور گسترده در این سخنرانی و سخنرانیهای باقیمانده این مجموعه بحث خواهیم کرد.
126
+
1. برداریسازی: فراهم کردن کد ماشین کامپایلشده و رابطهایی که این کد را قابل دسترس میکنند
127
+
1. کامپایل JIT: کامپایلرهایی که دستورات شبیه پایتون را در زمان اجرا به کد ماشین سریع تبدیل میکنند
128
+
2. موازیسازی: توزیع وظایف در چندین thread / CPU / GPU / TPU
129
129
130
+
ما این ایدهها را در ادامه به تفصیل بحث خواهیم کرد.
130
131
131
132
### اکوسیستم علمی پایتون
132
133
@@ -148,8 +149,7 @@ import random
148
149
* Pandas انواع و توابعی را برای دستکاری دادهها فراهم میکند.
149
150
* Numba یک کامپایلر just-in-time فراهم میکند که با NumPy به خوبی کار میکند و به تسریع کد پایتون کمک میکند.
150
151
151
-
ما همه این کتابخانهها را به طور گسترده در این مجموعه سخنرانیها مورد بحث قرار خواهیم داد.
152
-
152
+
ما همه این کتابخانهها را به تفصیل در این مجموعه درسها مورد بحث قرار خواهیم داد.
153
153
154
154
## پایتون خالص کند است
155
155
@@ -159,7 +159,6 @@ import random
159
159
160
160
برای این موضوع، مفید خواهد بود اگر درک کنیم که چه چیزی باعث سرعت اجرای کند میشود.
161
161
162
-
163
162
### کد سطح بالا در مقابل سطح پایین
164
163
165
164
زبانهای سطح بالاتر مانند پایتون برای انسانها بهینه شدهاند.
@@ -176,12 +175,10 @@ import random
176
175
177
176
از طرف دیگر، پیادهسازی استاندارد پایتون (به نام CPython) نمیتواند با سرعت زبانهای کامپایل شده مانند C یا Fortran برابری کند.
178
177
179
-
180
178
### گلوگاهها کجا هستند؟
181
179
182
180
چرا اینطور است؟
183
181
184
-
185
182
#### تایپ کردن پویا
186
183
187
184
```{index} single: Dynamic Typing
@@ -212,14 +209,11 @@ a, b = ['foo'], ['bar']
212
209
a + b
213
210
```
214
211
215
-
(ما میگوییم که عملگر `+`*بارگذاری شده* است --- عمل آن به نوع اشیایی که بر روی آنها عمل میکند بستگی دارد)
216
-
217
212
در نتیجه، هنگام اجرای `a + b`، پایتون ابتدا باید نوع اشیا را بررسی کند و سپس عملیات صحیح را فراخوانی کند.
218
213
219
-
این شامل یک سربار غیر قابل اغماض است.
220
-
221
-
اگر ما بارها و بارها این عبارت را در یک حلقه تنگ اجرا کنیم، سربار غیر قابل اغماض به یک سربار بزرگ تبدیل میشود.
214
+
این شامل سربار میشود.
222
215
216
+
اگر ما بارها و بارها این عبارت را در یک حلقه تنگ اجرا کنیم، سربار بزرگ میشود.
223
217
224
218
#### انواع ایستا
225
219
@@ -254,7 +248,6 @@ int main(void) {
254
248
255
249
نیازی به بررسی نوع نیست و بنابراین سربار وجود ندارد.
256
250
257
-
258
251
### دسترسی به داده
259
252
260
253
یکی دیگر از موانع سرعت برای زبانهای سطح بالا، دسترسی به داده است.
@@ -263,22 +256,15 @@ int main(void) {
263
256
264
257
#### جمع کردن با کد کامپایل شده
265
258
266
-
در C یا Fortran، این اعداد صحیح معمولاً در یک آرایه ذخیره میشوند که یک ساختار داده ساده برای ذخیره دادههای همگن است.
267
-
268
-
چنین آرایهای در یک بلوک پیوسته واحد از حافظه ذخیره میشود:
259
+
در C یا Fortran، یک آرایه از اعداد صحیح در یک بلوک پیوسته واحد از حافظه ذخیره میشود:
269
260
270
-
* در کامپیوترهای مدرن، آدرسهای حافظه به هر بایت اختصاص داده میشوند (یک بایت = 8 بیت).
271
261
* به عنوان مثال، یک عدد صحیح 64 بیتی در 8 بایت حافظه ذخیره میشود.
272
262
* یک آرایه از $n$ چنین اعداد صحیحی $8n$ شکاف حافظه *متوالی* اشغال میکند.
273
263
274
-
علاوه بر این، کامپایلر توسط برنامهنویس از نوع داده آگاه میشود.
275
-
276
-
* در این مورد اعداد صحیح 64 بیتی
264
+
علاوه بر این، نوع داده در زمان کامپایل مشخص است.
277
265
278
266
از این رو، هر نقطه داده متوالی میتواند با جابجایی رو به جلو در فضای حافظه به میزان مشخص و ثابتی دسترسی پیدا کند.
279
267
280
-
* در این مورد 8 بایت
281
-
282
268
#### جمع کردن در پایتون خالص
283
269
284
270
پایتون سعی میکند این ایدهها را تا حدی تکرار کند.
@@ -289,11 +275,7 @@ int main(void) {
289
275
290
276
از این رو، هنوز سربار در دسترسی به خود مقادیر داده وجود دارد.
291
277
292
-
این یک مانع قابل توجه بر سرعت است.
293
-
294
-
در واقع، به طور کلی درست است که ترافیک حافظه یک مجرم اصلی است وقتی صحبت از اجرای کند میشود.
295
-
296
-
278
+
چنین سرباری یک مجرم اصلی است وقتی صحبت از اجرای کند میشود.
297
279
298
280
### خلاصه
299
281
@@ -311,11 +293,6 @@ int main(void) {
311
293
312
294
این کار بهترین است که به کامپایلرهای تخصصی واگذار شود!
313
295
314
-
برخی از کتابخانههای پایتون قابلیتهای برجستهای برای موازیسازی کد علمی دارند -- ما در ادامه بیشتر در این مورد بحث خواهیم کرد.
315
-
316
-
317
-
318
-
319
296
## تسریع پایتون
320
297
321
298
در این بخش به سه تکنیک مرتبط برای تسریع کد پایتون نگاه میکنیم.
@@ -324,8 +301,6 @@ int main(void) {
324
301
325
302
بعداً به کتابخانههای خاص و نحوه پیادهسازی این ایدهها توسط آنها نگاه خواهیم کرد.
NumPy از مدلی مشابه استفاده میکند که از MATLAB الهام گرفته است.
360
335
361
336
### برداریسازی در مقابل حلقههای پایتون خالص
362
337
@@ -414,50 +389,39 @@ with qe.Timer():
414
389
415
390
در سخنرانیهای بعدی در این مجموعه، در مورد چگونگی بهرهبرداری کتابخانههای مدرن پایتون از کامپایلرهای just-in-time برای تولید کد ماشین سریع، کارآمد و موازی یاد خواهیم گرفت.
416
391
417
-
418
-
419
-
420
392
## موازیسازی
421
393
422
394
رشد سرعت کلاک CPU (یعنی سرعتی که یک زنجیره منفرد منطقی میتواند اجرا شود) در سالهای اخیر به طور چشمگیری کند شده است.
423
395
424
396
طراحان تراشه و برنامهنویسان کامپیوتر با کندی با جستجوی مسیری متفاوت برای اجرای سریع پاسخ دادهاند: موازیسازی.
425
397
426
-
سازندگان سختافزار تعداد هستهها (CPUهای فیزیکی) تعبیه شده در هر ماشین را افزایش دادهاند.
427
-
428
-
برای برنامهنویسان، چالش این بوده است که از این CPUهای چندگانه با اجرای بسیاری از فرآیندها به صورت موازی (یعنی همزمان) بهرهبرداری کنند.
398
+
این شامل موارد زیر میشود:
429
399
430
-
این امر به ویژه در برنامهنویسی علمی مهم است که نیاز به مدیریت موارد زیر دارد:
400
+
1. افزایش تعداد CPUهای تعبیه شده در هر ماشین
401
+
1. اتصال شتابدهندههای سختافزاری مانند GPUها و TPUها
431
402
432
-
* مقادیر زیادی از دادهها و
433
-
* شبیهسازیهای فشرده CPU و سایر محاسبات.
403
+
برای برنامهنویسان، چالش این بوده است که از این سختافزار با اجرای بسیاری از فرآیندها به صورت موازی بهرهبرداری کنند.
434
404
435
405
در زیر ما موازیسازی برای محاسبات علمی را با تمرکز بر موارد زیر بحث میکنیم:
436
406
437
-
1.بهترین ابزارها برای موازیسازی در پایتون و
407
+
1.ابزارهای موازیسازی در پایتون و
438
408
1. چگونه این ابزارها میتوانند برای مسائل اقتصادی کمی به کار گرفته شوند.
439
409
440
-
441
410
### موازیسازی بر روی CPUها
442
411
443
412
بیایید دو نوع اصلی موازیسازی مبتنی بر CPU که معمولاً در محاسبات علمی استفاده میشود را مرور کنیم و مزایا و معایب آنها را بحث کنیم.
444
413
445
-
446
414
#### چندپردازشی
447
415
448
-
چندپردازشی به معنای اجرای همزمان چندین فرآیند با استفاده از بیش از یک پردازنده است.
449
-
450
-
در این زمینه، یک **فرآیند** یک زنجیره از دستورات (یعنی یک برنامه) است.
416
+
چندپردازشی به معنای اجرای همزمان چندین رشته منطقی با استفاده از بیش از یک پردازنده است.
451
417
452
-
چندپردازشی میتواند روی یک ماشین با CPUهای چندگانه یا روی مجموعهای از ماشینهای متصل شده توسط یک شبکه انجام شود.
418
+
چندپردازشی میتواند روی یک ماشین با CPUهای چندگانه یا روی کلاستری از ماشینهای متصل شده توسط یک شبکه انجام شود.
453
419
454
-
در مورد دوم، مجموعه ماشینها معمولاً **کلاستر** نامیده میشود.
455
-
456
-
با چندپردازشی، هر فرآیند فضای حافظه خود را دارد، اگرچه تراشه حافظه فیزیکی ممکن است مشترک باشد.
420
+
با چندپردازشی، *هر فرآیند فضای حافظه خود را دارد*، اگرچه تراشه حافظه فیزیکی ممکن است مشترک باشد.
457
421
458
422
#### چندرشتهای
459
423
460
-
چندرشتهای شبیه به چندپردازشی است، به جز اینکه، در طول اجرا، همه رشتهها فضای حافظه یکسانی را به اشتراک میگذارند.
424
+
چندرشتهای شبیه به چندپردازشی است، به جز اینکه، در طول اجرا، همه رشتهها *فضای حافظه یکسانی را به اشتراک میگذارند*.
461
425
462
426
پایتون بومی برای پیادهسازی چندرشتهای به دلیل برخی [ویژگیهای طراحی قدیمی](https://wiki.python.org/moin/GlobalInterpreterLock) مشکل دارد.
463
427
@@ -475,7 +439,6 @@ with qe.Timer():
475
439
476
440
برای اکثریت قریب به اتفاق کاری که ما در این سخنرانیها انجام میدهیم، چندرشتهای کافی خواهد بود.
477
441
478
-
479
442
### شتابدهندههای سختافزاری
480
443
481
444
در حالی که CPUها با هستههای چندگانه برای محاسبات موازی استاندارد شدهاند، یک تغییر چشمگیرتر با ظهور شتابدهندههای سختافزاری تخصصی رخ داده است.
@@ -501,7 +464,6 @@ TPUها یک توسعه اخیرتر هستند که توسط گوگل به طو
501
464
502
465
مانند GPUها، TPUها در انجام تعداد عظیمی از عملیات ماتریسی به صورت موازی عالی هستند.
503
466
504
-
505
467
#### چرا TPU/GPU مهم هستند
506
468
507
469
دستاوردهای عملکردی از استفاده از شتابدهندههای سختافزاری میتواند چشمگیر باشد.
@@ -512,7 +474,6 @@ TPUها یک توسعه اخیرتر هستند که توسط گوگل به طو
512
474
513
475
این امر به ویژه برای محاسبات علمی مرتبط است زیرا بسیاری از الگوریتمها به طور طبیعی بر روی معماری موازی GPUها نگاشت میشوند.
514
476
515
-
516
477
### GPUهای تکی در مقابل سرورهای GPU
517
478
518
479
دو روش رایج برای دسترسی به منابع GPU وجود دارد:
@@ -527,7 +488,6 @@ TPUها یک توسعه اخیرتر هستند که توسط گوگل به طو
527
488
528
489
کتابخانههای مدرن پایتون مانند JAX که به طور گسترده در این مجموعه سخنرانیها مورد بحث قرار میگیرند، به طور خودکار GPUهای موجود را با تغییرات حداقلی در کد تشخیص داده و استفاده میکنند.
529
490
530
-
531
491
#### سرورهای چند GPU
532
492
533
493
برای مسائل در مقیاس بزرگتر، سرورهای حاوی GPUهای متعدد (اغلب 4-8 GPU در هر سرور) به طور فزایندهای رایج هستند.
@@ -540,11 +500,10 @@ TPUها یک توسعه اخیرتر هستند که توسط گوگل به طو
540
500
541
501
این محققان را قادر میسازد مسائلی را که بر روی یک GPU یا CPU تکی غیرعملی هستند، مورد بررسی قرار دهند.
542
502
543
-
544
503
### خلاصه
545
504
546
505
محاسبات GPU بسیار در دسترستر میشود، به ویژه از داخل پایتون.
547
506
548
507
برخی از کتابخانههای علمی پایتون، مانند JAX، اکنون شتاب GPU را با تغییرات حداقلی در کد موجود پشتیبانی میکنند.
549
508
550
-
ما محاسبات GPU را با جزئیات بیشتری در سخنرانیهای بعدی بررسی خواهیم کرد و آن را در طیف وسیعی از کاربردهای اقتصادی به کار خواهیم برد.
509
+
ما محاسبات GPU را با جزئیات بیشتری در سخنرانیهای بعدی بررسی خواهیم کرد و آن را در طیف وسیعی از کاربردهای اقتصادی به کار خواهیم برد.
0 commit comments