การใช้งาน GPIPE ใน Pytorch มันได้รับการปรับให้เหมาะสมสำหรับ cuda มากกว่า TPU
from torchgpipe import GPipe
model = nn . Sequential ( a , b , c , d )
model = GPipe ( model , balance = [ 1 , 1 , 1 , 1 ], chunks = 8 )
output = model ( input )GPIPE เป็นห้องสมุดขนานไปป์ไลน์ที่ปรับขนาดได้ซึ่งเผยแพร่โดย Google Brain ซึ่งช่วยให้การฝึกอบรมที่มีประสิทธิภาพของโมเดลขนาดใหญ่ที่ใช้เวลานาน จากข้อมูลของกระดาษ GPIPE สามารถฝึกอบรมรุ่นที่ใหญ่กว่า 25X โดยใช้อุปกรณ์ 8x (TPU) และฝึกอบรมเร็วขึ้น 3.5x รุ่น 3.5x โดยใช้อุปกรณ์ 4x
GPIPE: การฝึกอบรมที่มีประสิทธิภาพของเครือข่ายประสาทยักษ์โดยใช้ Pipeline Parallelism
Google ได้รับการฝึกฝน AMOEBANET-B พร้อมพารามิเตอร์ 557M เหนือ GPIPE โมเดลนี้ประสบความสำเร็จ 84.3% Top-1 และ 97.0% ความแม่นยำสูงสุด 5 อันดับแรกของมาตรฐานการจำแนกประเภท Imagenet (ประสิทธิภาพที่ล้ำสมัย ณ เดือนพฤษภาคม 2019)
GPIPE ใช้ (a) การขนานกันไปป์ไลน์และ (b) การคำนวณการชดเชยอัตโนมัติของการแพร่กระจายไปข้างหน้าในระหว่างการ backpropagation จึงใช้ประโยชน์จากการฝึกอบรมแบบจำลองขนาดใหญ่ เราอ้างถึง (b) เป็นจุดตรวจสอบตามคำศัพท์ที่รู้จักกันดีในชุมชน Pytorch
ปัจจุบัน TorchgPipe ต้องการสภาพแวดล้อมดังต่อไปนี้:
หากต้องการใช้ torchgpipe ให้ติดตั้งผ่าน PYPI:
$ pip install torchgpipe ในการฝึกอบรมโมดูลด้วย GPIPE เพียงห่อด้วย torchgpipe.GPipe โมดูลของคุณจะต้องเป็น nn.Sequential เนื่องจาก GPIPE จะแบ่งโมดูลออกเป็นพาร์ติชันโดยอัตโนมัติด้วยเลเยอร์ต่อเนื่อง อาร์กิวเมนต์ balance กำหนดจำนวนเลเยอร์ในแต่ละพาร์ติชัน อาร์กิวเมนต์ chunks ระบุจำนวนของไมโครแบทช์ อินพุตเอาท์พุทและเทนเซอร์ระดับกลางจะต้องเป็น Tensor หรือ Tuple[Tensor, ...]
รหัสตัวอย่างด้านล่างแสดงวิธีแยกโมดูลด้วยสี่เลเยอร์เป็นสี่พาร์ติชันแต่ละอันมีเลเยอร์เดียว รหัสนี้ยังแยกมินิแบทช์ออกเป็น 8 micro-batches:
from torchgpipe import GPipe
model = nn . Sequential ( a , b , c , d )
model = GPipe ( model , balance = [ 1 , 1 , 1 , 1 ], chunks = 8 )
for input in data_loader :
output = model ( input )เยี่ยมชม torchgpipe.readthedocs.io สำหรับข้อมูลเพิ่มเติมรวมถึงการอ้างอิง API
รายละเอียดทั้งหมดและมาตรฐานเพิ่มเติมมีอยู่ใน torchgpipe.readthedocs.io
| ขนาดแบทช์ | Torchgpipe | nn.dataparallel | Goyal และคณะ |
|---|---|---|---|
| 256 | 21.99 ± 0.13 | 22.02 ± 0.11 | 22.08 ± 0.06 |
| 1k | 22.24 ± 0.19 | 22.04 ± 0.24 | N/A |
| 4K | 22.13 ± 0.09 | N/A | N/A |
GPIPE ควรมีความโปร่งใสที่จะไม่แนะนำการปรับแต่งพารามิเตอร์เพิ่มเติม ในการตรวจสอบความโปร่งใสเราทำซ้ำอัตราความผิดพลาดของ TOP-1 ของ RESNET-101 บน ImageNet ตามที่รายงานในตารางที่ 2 (c) ของ SGD ขนาดใหญ่ที่ถูกต้องขนาดใหญ่โดย Goyal และคณะ
| การทดลอง | U-Net (B, C) | พารามิเตอร์ | การใช้หน่วยความจำ |
|---|---|---|---|
| พื้นฐาน | (6, 72) | 362.2m | 20.3 กิบ |
| PIPELINE-1 | (11, 128) | 2.21b | 20.5 กิบ |
| Pipeline-2 | (24, 128) | 4.99b | 43.4 กิ๊บ |
| PIPELINE-4 | (24, 160) | 7.80b | 79.1 กิบ |
| PIPELINE-8 | (48, 160) | 15.82b | 154.1 กิบ |
ตารางแสดงให้เห็นว่า GPIPE อำนวยความสะดวกในการปรับขนาดรุ่น U-NET ได้อย่างไร พื้นฐาน หมายถึงพื้นฐานที่ไม่มีการขนานไปป์ไลน์หรือจุดตรวจสอบและ Pipeline -1 , -2 , -4 , -8 หมายถึงว่าแบบจำลองได้รับการฝึกฝนด้วย GPIPE ด้วยจำนวนพาร์ติชันที่สอดคล้องกัน
ที่นี่เราใช้สถาปัตยกรรม U-Net ที่เรียบง่าย ขนาดของแบบจำลองจะถูกกำหนดโดย hyperparameters B และ C ซึ่งเป็นสัดส่วนกับจำนวนเลเยอร์และตัวกรองตามลำดับ
| การทดลอง | ปริมาณงาน | เร่งความเร็ว |
|---|---|---|
| พื้นฐาน | 28.500/s | 1 × |
| PIPELINE-1 | 24.456/s | 0.858 × |
| Pipeline-2 | 35.502/s | 1.246 × |
| PIPELINE-4 | 67.042/s | 2.352 × |
| PIPELINE-8 | 88.497/s | 3.105 × |
เพื่อตรวจสอบประสิทธิภาพด้วยการเชื่อมต่อข้ามเราวัดปริมาณงานของ U-NET ด้วยจำนวนอุปกรณ์ต่างๆ เราเลือกที่จะใช้ U-NET เนื่องจากมีการเชื่อมต่อข้ามนานหลายครั้ง
| การทดลอง | ปริมาณงาน | Torchgpipe | Huang et al. |
|---|---|---|---|
| n = 2, m = 1 | 26.733/s | 1 × | 1 × |
| n = 2, m = 4 | 41.133/s | 1.546 × | 1.07 × |
| n = 2, m = 32 | 47.386/s | 1.780 × | 1.21 × |
| n = 4, m = 1 | 26.827/s | 1.006 × | 1.13 × |
| n = 4, m = 4 | 44.543/s | 1.680 × | 1.26 × |
| n = 4, m = 32 | 72.412/s | 2.711 × | 1.84 × |
| n = 8, m = 1 | 24.918/s | 0.932 × | 1.38 × |
| n = 8, m = 4 | 70.065/s | 2.625 × | 1.72 × |
| n = 8, m = 32 | 132.413/s | 4.966 × | 3.48 × |
( N : จำนวนพาร์ติชั่น, M : จำนวน micro-batches)
ตารางแสดงเกณฑ์มาตรฐานความเร็วที่ทำซ้ำบน amoebanet-d (18, 256) ตามที่รายงานไว้ในตารางที่ 2 ของ GPIPE โดย Huang และคณะ โปรดทราบว่าเราแทนที่ k ในกระดาษด้วย n
โครงการนี้ใช้งานได้ แต่อินเทอร์เฟซยังไม่ได้รับการยืนยัน API สาธารณะทั้งหมดอาจมีการเปลี่ยนแปลงโดยไม่มีการเตือนล่วงหน้าจนถึง v0.1.0
โครงการ Torchgpipe ได้รับการพัฒนาโดย Heungsub Lee, Myungryong Jeong และ Chiheon Kim ที่ Kakao Brain กับ Sungbin Lim, Ildoo Kim, Woonhyuk Baek และ Boogeon Yoon มีการแจกจ่ายภายใต้ใบอนุญาต BSD 3 ข้อ
หากคุณใช้ห้องสมุดนี้กับโครงการและการวิจัยใด ๆ โปรดอ้างอิงรหัสของเรา:
@article{kim2020torchgpipe,
title={torchgpipe: On-the-fly Pipeline Parallelism for Training Giant Models},
author={Chiheon Kim and Heungsub Lee and Myungryong Jeong and Woonhyuk Baek and Boogeon Yoon and Ildoo Kim and Sungbin Lim and Sungwoong Kim},
year={2020},
eprint={2004.09910},
archivePrefix={arXiv}
}