เทคนิคบางอย่างของ pytorch
การเปลี่ยนแปลง
- 29 พฤศจิกายน 2019: อัปเดตเทคนิคการออกแบบแบบจำลองและเนื้อหาการเร่งความเร็วด้วยเหตุผลและเพิ่มลิงค์แนะนำไปยัง Apex
นอกจากนี้ฉันลบ tfrecord, pytorch สามารถใช้ได้หรือไม่? ฉันจำได้ว่าฉันทำไม่ได้ดังนั้นฉันจึงลบออก (ระบุการลบ: <) - 30 พฤศจิกายน 2019: ความหมายของ Mac เสริมลิงก์กระดาษของ Shufflenetv2 เสริม
- 2 ธันวาคม 2019: pytorch ที่ฉันพูดถึงก่อนหน้านี้ไม่สามารถใช้ tfrecord ได้ วันนี้ฉันเห็นคำตอบจาก https://www.zhihu.com/question/358632497 และฉันอยู่ในท่าที่เพิ่มขึ้น
- 23 ธันวาคม 2019: เพิ่มบทความทางวิทยาศาสตร์ยอดนิยมหลายเรื่องเกี่ยวกับปริมาณการบีบอัดแบบจำลอง
- 7 กุมภาพันธ์ 2563: สิ่งที่ควรทราบบางอย่างถูกตัดตอนมาจากบทความและเพิ่มลงในส่วนระดับรหัส
- 30 เมษายน 2563:
- เพิ่มเอกสารสำรองของ GitHub
- ลิงค์เสริมไปยังการแนะนำของเลเยอร์ convolutional และ BN Layer Fusion
- นี่คือคำอธิบายอื่น สำหรับบทความและคำตอบของเพื่อนหลายคนที่ฉันอ้างถึงมาก่อนลิงก์และสรุปเนื้อหาที่เกี่ยวข้องจะไม่เชื่อมโยงเข้าด้วยกัน คาดว่าเพื่อนบางคนจะถามคำถามเมื่ออ่านเนื้อหาที่เกี่ยวข้องและพวกเขาไม่สามารถถามผู้เขียนดั้งเดิมได้ ฉันเสียใจอย่างยิ่งที่นี่
- ปรับเนื้อหาบางส่วนและพยายามที่จะสอดคล้องกับลิงค์อ้างอิง
- 18 พฤษภาคม 2020: เพิ่มเคล็ดลับใน Pytorch เพื่อบันทึกหน่วยความจำวิดีโอ ในเวลาเดียวกันเพียงปรับรูปแบบ ฉันยังพบข้อผิดพลาดก่อนหน้านี้: คำแนะนำของ
non_blocking=False ควรเป็น non_blocking=True - 6 มกราคม 2021: ปรับบทนำบางอย่างเกี่ยวกับการอ่านข้อมูลภาพ
- 13 มกราคม 2564: เพิ่มกลยุทธ์สำหรับการใช้เหตุผลเร่งความเร็ว ฉันคิดว่าฉันควรอัปเดตเอกสาร GitHub ก่อน การอัปเดตคำตอบของ Zhihu นั้นค่อนข้างลำบากและเป็นไปไม่ได้ที่จะเปรียบเทียบการเปลี่ยนแปลงของข้อมูลดังนั้นจึงเป็นเรื่องยากมาก
- 26 มิถุนายน 2565: รูปแบบและการจัดเรียงเนื้อหาต่อไปนี้ได้รับการปรับอีกครั้งในขณะที่การอ้างอิงเพิ่มเติมและการค้นพบล่าสุดบางส่วนได้รับการเพิ่ม
- 20 มิถุนายน 2024: การปรับรูปแบบอย่างง่ายนั้นเสริมด้วยแนวคิดที่จะเร่งการอ่านข้อมูลตามรูปแบบ
tar และ IterableDataset
Pytorch เร่งความเร็ว
บันทึก
เอกสารต้นฉบับ: https://www.yuque.com/lart/ugkv9f/ugysgn
คำแถลง: เนื้อหาส่วนใหญ่มาจากการแบ่งปัน Zhihu และบล็อกอื่น ๆ และมีการระบุไว้ที่นี่เป็นคอลเลกชันเท่านั้น ยินดีต้อนรับข้อเสนอแนะเพิ่มเติม
zhihu คำตอบ (ยินดีต้อนรับสู่ชอบ):
- การโหลดข้อมูล Pytorch Dataloader ใช้เวลาส่วนใหญ่ พวกคุณแก้ปัญหาได้อย่างไร? - คำตอบของศิลปินผู้คน - Zhihu
- เมื่อใช้ pytorch มีชุดการฝึกอบรมมากเกินไปที่จะเข้าถึงหลายสิบล้านและฉันควรทำอย่างไรถ้า dataloader โหลดช้ามาก? - คำตอบของศิลปินผู้คน - Zhihu
ความเร็วในการปรับสภาพ
- เพื่อลดการดำเนินการก่อนการประมวลผลล่วงหน้าทุกครั้งที่คุณอ่านข้อมูลคุณสามารถพิจารณาใช้การดำเนินการคงที่บางอย่างเช่น
resize และบันทึกล่วงหน้าและใช้โดยตรงระหว่างการฝึกอบรม - ย้ายการประมวลผลล่วงหน้าไปยัง GPU เพื่อเร่งความเร็ว
- Linux สามารถใช้
NVIDIA/DALI - ใช้การดำเนินการประมวลผลภาพที่ใช้เทนเซอร์
io เร่งความเร็ว
- MMCV ให้การสนับสนุนที่ค่อนข้างมีประสิทธิภาพและครอบคลุมสำหรับการอ่านข้อมูล: OpenMMLAB: MMCV Core Component Analysis (III): FileClient
ใช้การประมวลผลภาพที่เร็วขึ้น
-
opencv โดยทั่วไปเร็วกว่า PIL- โปรดทราบว่ากลยุทธ์การโหลดขี้เกียจของ
PIL ทำให้ดู open imread opencv แต่อันที่จริงแล้วมันไม่ได้โหลดข้อมูลอย่างเต็มที่ คุณสามารถเรียกวิธี load() บนวัตถุที่ส่งคืนโดย open เพื่อโหลดข้อมูลด้วยตนเอง ความเร็วมีความสมเหตุสมผลในเวลานี้
- สำหรับการอ่าน
jpeg คุณสามารถลอง jpeg4py - บันทึกกราฟ
bmp (ลดเวลาในการถอดรหัส) - การอภิปรายเกี่ยวกับความเร็วของไลบรารีการประมวลผลภาพที่แตกต่างกัน: อะไรคือความแตกต่างระหว่างวิธีการใช้งานและความเร็วในการอ่านของฟังก์ชั่น imread ที่หลากหลายของ Python? - Zhihu
รวมข้อมูลลงในไฟล์ต่อเนื่องเดียว (ลดจำนวนการอ่าน)
สำหรับการอ่านไฟล์ขนาดเล็กขนาดใหญ่สามารถบันทึกเป็นรูปแบบไฟล์ต่อเนื่องที่สามารถอ่านได้อย่างต่อเนื่อง คุณสามารถเลือกที่จะพิจารณา TFRecord (Tensorflow) , recordIO , hdf5 , pth , n5 , lmdb ฯลฯ
-
TFRecord : https://github.com/vahidk/tfrecord - ฐานข้อมูล
lmdb :- https://github.com/fangyh09/image2lmdb
- https://blog.csdn.net/p_lart/article/details/103208405
- https://github.com/lartpang/pysodtoolbox/blob/master/forbigdataset/imagefolder2lmdb.py
- การใช้งานตามไฟล์
Tar และ IterableDataset
ข้อมูลอ่านล่วงหน้า
อ่านข้อมูลล่วงหน้าที่จำเป็นสำหรับการทำซ้ำครั้งต่อไป ใช้กรณี:
- วิธีให้ข้อมูล Dataloader ใน Pytorch - บทความ mkfmiku - Zhihu
- เร่งการอ่านข้อมูลไปยัง Pytorch - บทความเกี่ยวกับ HI - Zhihu
ด้วยหน่วยความจำ
- โหลดลงในหน่วยความจำโดยตรง
- อ่านภาพและบันทึกลงในวัตถุคอนเทนเนอร์คงที่
- แผนที่หน่วยความจำไปที่ดิสก์
กับสถานะของแข็ง
ฮาร์ดดิสก์เชิงกลจะถูกแทนที่ด้วยสถานะโซลิด NVME อ้างถึงวิธีการให้เลือดไก่ใน dataloader ใน Pytorch - บทความของ Mkfmiku - Zhihu
กลยุทธ์การฝึกอบรม
การฝึกอบรมความแม่นยำต่ำ
ในการฝึกอบรมการแสดงความแม่นยำต่ำ ( FP16 หรือ INT8 , เครือข่ายไบนารีและเครือข่ายสามค่า) ถูกนำมาใช้แทนการเป็นตัวแทนความแม่นยำดั้งเดิม ( FP32 )
มันสามารถบันทึกหน่วยความจำวิดีโอจำนวนหนึ่งและเพิ่มความเร็ว แต่ระวังการดำเนินการที่ไม่ปลอดภัยเช่นค่าเฉลี่ยและผลรวม
- บทนำสู่การฝึกอบรมที่มีความแม่นยำผสม:
- บทช่วยสอนการฝึกอบรมที่แม่นยำจากความตื้นเขินลึก
- การสนับสนุนความแม่นยำแบบผสมที่จัดทำโดย
NVIDIA/Apex- Pytorch สิ่งประดิษฐ์ที่ต้องมี ฟรีฟรี: การเร่งความเร็วแบบไฮบริดที่ใช้เอเพ็กซ์
- การติดตั้ง Pytorch ของ Apex ที่ยากและเป็นโรคเบ็ดเตล็ด - บทความของ Chen Hanke - Zhihu
- pytorch1.6 เริ่มให้
torch.cuda.amp เพื่อรองรับความแม่นยำผสม
ชุดที่ใหญ่กว่า
แบทช์ขนาดใหญ่มีแนวโน้มที่จะนำไปสู่เวลาการฝึกอบรมที่สั้นลงในกรณีของยุคคงที่ อย่างไรก็ตามแบทช์ขนาดใหญ่ต้องเผชิญกับข้อควรพิจารณามากมายเช่นการตั้งค่าไฮเปอร์พารามิเตอร์และการใช้หน่วยความจำซึ่งเป็นอีกพื้นที่หนึ่งที่ดึงดูดความสนใจมาก
- การตั้งค่าไฮเปอร์พารามิเตอร์
- Minibatch ขนาดใหญ่ที่แม่นยำ SGD: การฝึกอบรม Imagenet ใน 1 ชั่วโมงกระดาษ
- เพิ่มประสิทธิภาพการใช้หน่วยความจำวิดีโอ
- การสะสมการไล่ระดับสี
- จุดตรวจการไล่ระดับสี
- ฝึกอวนลึกด้วยค่าใช้จ่ายหน่วยความจำ sublinear, กระดาษ
- การดำเนินงานในสถานที่
- BatchNorm ที่เปิดใช้งานในสถานที่สำหรับการฝึกอบรมหน่วยความจำที่เพิ่มประสิทธิภาพของ DNNS, เอกสาร, รหัส
ระดับรหัส
การตั้งค่าห้องสมุด
- การตั้งค่า
torch.backends.cudnn.benchmark = True ก่อนที่ลูปการฝึกอบรมจะสามารถเพิ่มความเร็วในการคำนวณได้ เนื่องจากประสิทธิภาพของอัลกอริทึม CUDNN ที่คำนวณความเชื่อมั่นของขนาดเคอร์เนลที่แตกต่างกันแตกต่างกัน Autotuner สามารถเรียกใช้มาตรฐานเพื่อค้นหาอัลกอริทึมที่ดีที่สุด ขอแนะนำให้เปิดใช้งานการตั้งค่านี้เมื่อขนาดอินพุตของคุณไม่เปลี่ยนแปลงบ่อยครั้ง หากขนาดอินพุตเปลี่ยนแปลงบ่อยครั้ง AutoTuner จะต้องได้รับการเปรียบเทียบบ่อยเกินไปซึ่งอาจส่งผลกระทบต่อประสิทธิภาพ มันสามารถเพิ่มความเร็วในการแพร่กระจายไปข้างหน้าและย้อนกลับ 1.27x เป็น 1.70x - ใช้หน้าเพื่อล็อคหน่วยความจำนั่นคือตั้ง
pin_memory=True ใน dataloader - สำหรับ
num_worker ที่เหมาะสมการสนทนาอย่างละเอียดสามารถพบได้ในคู่มือการเร่งความเร็วของ Pytorch - บทความของ Yunmeng - Zhihu - Optimizer.zero_grad (set_to_none = false ที่นี่คุณสามารถลดรอยเท้าหน่วยความจำได้โดยการตั้งค่า
model.zero_grad() set_to_none=True และสามารถปรับปรุงประสิทธิภาพในระดับ None optimizer.zero_grad() สิ่งนี้จะเปลี่ยนพฤติกรรมบางอย่างซึ่งสามารถมองเห็นเอกสาร memset memset และการไล่ระดับสีจะได้รับการอัปเด None โดยใช้การดำเนินการ "เขียนเท่านั้น" - ในระหว่างการ backpropagation ให้ใช้โหมด
eval และใช้ torch.no_grad เพื่อปิดการคำนวณการไล่ระดับสี - พิจารณาใช้รูปแบบหน่วยความจำ channels_last
- แทนที่
DataParallel ด้วย DistributedDataParallel สำหรับ multi-gpus แม้ว่าจะ DataParallel เพียงโหนดเดียว DistributedDataParallel มักจะเป็นที่ต้องการเสมอเพราะ DistributedDataParallel จะถูกนำไปใช้กับหลายกระบวนการและสร้างหนึ่งสำหรับแต่ละ GPU โดยการผ่าน Python Global Interpreter Lock (GIL) และเพิ่มความเร็ว
แบบอย่าง
- อย่าเริ่มต้นตัวแปรที่ไม่ได้ใช้ใด ๆ เนื่องจากการเริ่มต้นและ
forward ของ Pytorch นั้นแยกจากกันและมันจะไม่เริ่มต้นเพราะคุณไม่ได้ใช้ -
@torch.jit.script ใช้ pytroch jit เพื่อฟิวส์การดำเนินการทีละจุดไปยังเคอร์เนล cuda เดียว Pytorch เพิ่มประสิทธิภาพการทำงานของเทนเซอร์ด้วยขนาดใหญ่ มันไม่มีประสิทธิภาพมากที่จะดำเนินการมากเกินไปในเทนเซอร์ขนาดเล็กใน Pytorch ดังนั้นหากเป็นไปได้การเขียนการดำเนินการคำนวณทั้งหมดลงในแบทช์สามารถลดการบริโภคและปรับปรุงประสิทธิภาพ หากคุณไม่สามารถใช้การดำเนินการแบบแบตช์ด้วยตนเอง Torchscript สามารถใช้เพื่อปรับปรุงประสิทธิภาพของรหัสของคุณ Torchscript เป็นชุดย่อยของฟังก์ชั่น Python แต่หลังจาก pytorch ได้รับการตรวจสอบโดย pytorch, pytorch สามารถเพิ่มประสิทธิภาพรหัส Torchscript โดยอัตโนมัติเพื่อปรับปรุงประสิทธิภาพผ่านคอมไพเลอร์ในเวลา (JTT) แต่วิธีที่ดีกว่าคือการใช้งานแบทช์ด้วยตนเอง - เมื่อใช้ FP16 ด้วยความแม่นยำผสมให้ตั้งค่าหลายขนาด 8 สำหรับการออกแบบสถาปัตยกรรมที่แตกต่างกันทั้งหมด
- เลเยอร์ convolutional ก่อนที่ BN สามารถลบอคติได้ เนื่องจากในทางคณิตศาสตร์อคติสามารถชดเชยได้โดยการลบ BN เราสามารถบันทึกพารามิเตอร์รุ่นและหน่วยความจำรันไทม์
ข้อมูล
- ตั้งค่าขนาดแบทช์เป็นหลาย 8 เพื่อเพิ่มการใช้หน่วยความจำ GPU
- ดำเนินการตามรูปแบบ Numpy ให้มากที่สุดเท่าที่จะทำได้ใน GPU
- ใช้
del เพื่อเพิ่มพื้นที่หน่วยความจำ - หลีกเลี่ยงการส่งข้อมูลที่ไม่จำเป็นระหว่างอุปกรณ์ต่าง ๆ
- เมื่อสร้างเทนเซอร์ให้ระบุอุปกรณ์โดยตรงแทนที่จะสร้างแล้วถ่ายโอนไปยังอุปกรณ์เป้าหมาย
- ใช้
torch.from_numpy(ndarray) หรือ torch.as_tensor(data, dtype=None, device=None) ซึ่งสามารถหลีกเลี่ยงการใช้พื้นที่ใหม่โดยการแชร์หน่วยความจำ สำหรับรายละเอียดและข้อควรระวังโปรดดูเอกสารที่เกี่ยวข้อง หากอุปกรณ์แหล่งที่มาและเป้าหมายเป็น CPU, torch.from_numpy และ torch.as_tensor จะไม่คัดลอกข้อมูล หากข้อมูลต้นฉบับเป็นอาร์เรย์ numpy ให้ใช้ torch.from_numpy เร็วกว่า หากข้อมูลต้นฉบับเป็นเทนเซอร์ที่มีประเภทข้อมูลและประเภทอุปกรณ์เดียวกัน torch.as_tensor สามารถหลีกเลี่ยงการคัดลอกข้อมูลซึ่งอาจเป็นรายการ tuple หรือเทนเซอร์ของ Python - ใช้การส่งสัญญาณที่ไม่ปิดกั้นนั่นคือตั้ง
non_blocking=True สิ่งนี้พยายามแปลงแบบอะซิงโครนัสหากเป็นไปได้เช่นการแปลง CPU Tensor ในหน่วยความจำล็อคหน้าเป็น CUDA Tensor
การเพิ่มประสิทธิภาพของเครื่องมือเพิ่มประสิทธิภาพ
- จัดเก็บพารามิเตอร์โมเดลในหน่วยความจำอย่างต่อเนื่องซึ่งจะช่วยลดเวลาของ
optimizer.step()-
contiguous_pytorch_params
- ใช้การสร้างบล็อกแบบหลอมรวมในยอด
การออกแบบแบบจำลอง
ซีเอ็นเอ็น
- Shufflenetv2, กระดาษ
- ช่องสัญญาณอินพุตและเอาต์พุตของเลเยอร์ convolution มีความสอดคล้อง: เมื่อจำนวนช่องสัญญาณอินพุตและเอาต์พุตของเลเยอร์ convolution เท่ากับ MAC (เวลาการใช้เวลาการใช้งานการเข้าถึงหน่วยความจำตัวย่อ
memory access cost คือ MAC ) มีขนาดเล็กที่สุดและความเร็วของโมเดลนั้นเร็วที่สุดในเวลานี้ - ลดการจัดกลุ่ม convolutional: การดำเนินการกลุ่มมากเกินไปจะเพิ่ม Mac ซึ่งจะทำให้โมเดลช้าลง
- ลดกิ่งแบบจำลอง: สาขาที่น้อยลงในแบบจำลอง
- ลดการดำเนินงาน
element-wise : การบริโภคเวลาที่เกิดจากการดำเนินงาน element-wise นั้นมากกว่าค่าที่สะท้อนอยู่ในฟอปส์ดังนั้นการดำเนินงาน element-wise ควรลดลงให้มากที่สุดเท่าที่จะทำได้ depthwise convolution ยังมีลักษณะของรองเท้าแตะต่ำและ Mac สูง
หม้อแปลงวิสัยทัศน์
- TRT-VIT: หม้อแปลงวิสัยทัศน์ที่มุ่งเน้น Tensorrt, กระดาษ, การตีความ
- ระดับสเตจ: บล็อกหม้อแปลงเหมาะสำหรับขั้นตอนต่อมาของโมเดลซึ่งช่วยเพิ่มการแลกเปลี่ยนระหว่างประสิทธิภาพและประสิทธิภาพสูงสุด
- ระดับเวที: รูปแบบการออกแบบเวทีที่มีตื้นก่อนแล้วจึงลึกสามารถปรับปรุงประสิทธิภาพได้
- บล็อกระดับ: บล็อกไฮบริดของหม้อแปลงและคอขวดมีประสิทธิภาพมากกว่าหม้อแปลงแยกต่างหาก
- บล็อกระดับ: รูปแบบการออกแบบบล็อกระดับโลกและท้องถิ่นช่วยชดเชยปัญหาประสิทธิภาพ
ไอเดียทั่วไป
- ลดความซับซ้อน: ตัวอย่างเช่นการตัดแบบจำลองและการตัดแต่งกิ่งลดเลเยอร์โมเดลและมาตราส่วนพารามิเตอร์
- ปรับเปลี่ยนโครงสร้างโมเดล: ตัวอย่างเช่นการกลั่นแบบจำลองและรับแบบจำลองขนาดเล็กผ่านวิธีการกลั่นความรู้
เร่งการใช้เหตุผล
ความแม่นยำและถ่วงน้ำหนักครึ่งหนึ่ง
ใช้ความแม่นยำต่ำ ( FP16 หรือ INT8 , เครือข่ายไบนารีและเครือข่ายสามค่า) ในการอนุมานเพื่อแทนที่การแทนความแม่นยำดั้งเดิม ( FP32 )
-
TensorRT เป็นเอ็นจิ้นการอนุมานเครือข่ายประสาทที่เสนอโดย NVIDIA ซึ่งรองรับปริมาณ 8 บิตหลังการฝึกอบรม มันใช้อัลกอริทึมการหาปริมาณแบบจำลองข้ามแบบข้ามไปยังเพื่อลดระดับความแตกต่างระหว่างการแจกแจงทั้งสอง - Pytorch1.3 ได้รองรับฟังก์ชั่นการหาปริมาณตามการใช้งาน Qnnpack และสนับสนุนการวัดปริมาณหลังการฝึกอบรมการฝึกอบรมเชิงปริมาณและการรับรู้เชิงปริมาณและเทคโนโลยีอื่น ๆ
- นอกจากนี้
Distiller เป็นเครื่องมือเพิ่มประสิทธิภาพแบบจำลองโอเพ่นซอร์สตาม Pytorch และสนับสนุนเทคโนโลยีเชิงปริมาณใน Pytorch ตามธรรมชาติ -
NNI ของ Microsoft รวมอัลกอริธึมการฝึกอบรมเชิงปริมาณที่หลากหลายและรองรับเฟรมเวิร์กโอเพนซอร์สหลายแบบเช่น PyTorch/TensorFlow/MXNet/Caffe2
สำหรับรายละเอียดเพิ่มเติมโปรดดูที่สาม AIS: [MISCELLEANCE TALK] เครื่องมือโอเพ่นซอร์สสำหรับการหาปริมาณโมเดลปัจจุบันคืออะไร?
ฟิวชั่นปฏิบัติการ
- แบบจำลองการให้เหตุผลการเร่งความเร็ว: การหลอมรวมของ BN และเลเยอร์ Conv - บทความของ Xiaoxiaojiang - Zhihu
- การบรรจบกันของเลเยอร์ความเชื่อมั่นและเลเยอร์ BN ในขั้นตอนการอนุมานเครือข่าย - บทความของ Autocyz - Zhihu
- Pytorch นั้นมีฟังก์ชั่นที่คล้ายกัน
การพารามิเตอร์ใหม่
- repvgg
- repvgg | ให้ convnet ของคุณสิ้นสุดเครือข่ายธรรมดาเกิน 80% top1 เป็นครั้งแรก
การวิเคราะห์เวลา
- Python มาพร้อมกับ
profile การวิเคราะห์ประสิทธิภาพหลายอย่าง cProfile และ hotshot วิธีการใช้งานนั้นเหมือนกัน ไม่มีอะไรมากไปกว่าโมดูลว่าเป็นงูหลามบริสุทธิ์หรือเขียนใน C. - Pytorch Profiler เป็นเครื่องมือที่รวบรวมการวัดประสิทธิภาพในระหว่างการฝึกอบรมและการอนุมาน API Context Manager ของ Profiler สามารถใช้เพื่อทำความเข้าใจได้ดีขึ้นว่าผู้ประกอบการรุ่นใดมีราคาแพงที่สุดตรวจสอบรูปร่างอินพุตและบันทึกสแต็กกิจกรรมเคอร์เนลอุปกรณ์การศึกษาและบันทึกการดำเนินการบันทึกการดำเนินการ
คำแนะนำโครงการ
- ใช้การบีบอัดแบบจำลองตาม pytorch:
- ปริมาณ: 8/4/2 บิต (Dorefa), ค่าสามค่า/ไบนารี (TWN/BNN/XNOR-NET)
- การตัดแต่งกิ่ง: ปกติการตัดแต่งช่องทางสำหรับโครงสร้าง convolutional ที่จัดกลุ่ม
- จัดกลุ่มโครงสร้าง convolutional
- BN Fusion สำหรับการหาปริมาณไบนารีฟีเจอร์
การอ่านขยาย
- การโหลดข้อมูล Pytorch Dataloader ใช้เวลาส่วนใหญ่ พวกคุณแก้ปัญหาได้อย่างไร? - Zhihu
- เมื่อใช้ pytorch มีชุดการฝึกอบรมมากเกินไปที่จะเข้าถึงหลายสิบล้านและฉันควรทำอย่างไรถ้า dataloader โหลดช้ามาก? - Zhihu
- ข้อผิดพลาด/ข้อบกพร่องใน Pytorch คืออะไร? - Zhihu
- เพิ่มประสิทธิภาพรหัสการฝึกอบรม Pytorch
- 26 วินาทีการฝึกอบรม GPU เดี่ยว CIFAR10, Jeff Dean ยังชอบทักษะการเพิ่มประสิทธิภาพการเรียนรู้อย่างลึกซึ้ง - บทความเกี่ยวกับหัวใจของเครื่องจักร - Zhihu
- หลังจากฝึกอบรมคุณสมบัติใหม่สองสามอย่างในโมเดลออนไลน์ทำไมเวลาทำนายของ Tensorflow ให้บริการช้ากว่าเดิมมากกว่า 20 เท่า? - คำตอบของ Tzesing - Zhihu
- การบีบอัดรูปแบบการเรียนรู้ลึก
- วันนี้โมเดลของคุณเร่งความเร็วหรือไม่? นี่คือ 5 วิธีสำหรับการอ้างอิงของคุณ (พร้อมการวิเคราะห์รหัส)
- บทสรุปของข้อผิดพลาดทั่วไปในบทความของ Pytorch - บทความของ Yu Zhenbo - Zhihu
- คู่มือเร่งความเร็ว Pytorch - บทความของ Yunmeng - Zhihu
- เพิ่มประสิทธิภาพความเร็วและประสิทธิภาพของหน่วยความจำของ Pytorch (2022)
Pytorch บันทึกหน่วยความจำวิดีโอ
เอกสารต้นฉบับ: https://www.yuque.com/lart/ugkv9f/nvffyf
รวบรวมจาก: เคล็ดลับสำหรับการบันทึกหน่วยความจำ (หน่วยความจำวิดีโอ) ใน Pytorch คืออะไร? - Zhihu https://www.zhihu.com/question/274635237
ใช้ในสถานที่
- พยายามเปิดใช้งานการดำเนินการที่รองรับ
inplace โดยค่าเริ่มต้น ตัวอย่างเช่น relu สามารถใช้ inplace=True -
batchnorm และฟังก์ชั่นการเปิดใช้งานเฉพาะบางอย่างสามารถบรรจุลงใน inplace_abn
ฟังก์ชันการสูญเสีย
การลบการสูญเสียในตอนท้ายของแต่ละลูปสามารถบันทึกหน่วยความจำวิดีโอน้อยมาก แต่มันดีกว่าไม่มีอะไรเลย เทนเซอร์เป็นตัวแปรและการปลดปล่อยหน่วยความจำที่ดีที่สุด
การผสมความแม่นยำ
มันสามารถบันทึกหน่วยความจำวิดีโอจำนวนหนึ่งและเพิ่มความเร็ว แต่ระวังการดำเนินการที่ไม่ปลอดภัยเช่นค่าเฉลี่ยและผลรวม
- บทนำสู่การฝึกอบรมที่มีความแม่นยำผสม:
- บทช่วยสอนการฝึกอบรมที่แม่นยำจากความตื้นเขินลึก
- การสนับสนุนความแม่นยำแบบผสมที่จัดทำโดย
NVIDIA/Apex- Pytorch สิ่งประดิษฐ์ที่ต้องมี ฟรีฟรี: การเร่งความเร็วแบบไฮบริดที่ใช้เอเพ็กซ์
- การติดตั้ง Pytorch ของ Apex ที่ยากและเป็นโรคเบ็ดเตล็ด - บทความของ Chen Hanke - Zhihu
- pytorch1.6 เริ่มให้
torch.cuda.amp เพื่อรองรับความแม่นยำผสม
จัดการการดำเนินงานที่ไม่ต้องการ backpropagation
- สำหรับเฟสไปข้างหน้าที่ไม่ต้องการ backpropagation เช่นการตรวจสอบและการอนุมานระยะเวลาใช้
torch.no_grad เพื่อห่อรหัส- โปรดทราบว่า
model.eval() ไม่เท่ากับ torch.no_grad() โปรดดูการสนทนาต่อไปนี้: 'model.eval ()' vs 'กับ Torch.no_grad ()'
- ตั้งค่า
requires_grad ของตัวแปรที่ไม่จำเป็นต้องคำนวณการไล่ระดับสีเป็น False เพื่อให้ตัวแปรไม่ได้มีส่วนร่วมในการแพร่กระจายย้อนหลังของการไล่ระดับสีเพื่อลดการใช้หน่วยความจำของการไล่ระดับสีที่ไม่จำเป็น - ลบเส้นทางการไล่ระดับสีที่ไม่จำเป็นต้องคำนวณ:
- Stochastic backpropagation: กลยุทธ์ที่มีประสิทธิภาพหน่วยความจำสำหรับการฝึกอบรมโมเดลวิดีโอการตีความสามารถเห็นได้:
- https://www.yuque.com/lart/papers/xu5t00
- https://blog.csdn.net/p_lart/article/details/124978961
การทำความสะอาดหน่วยความจำวิดีโอ
-
torch.cuda.empty_cache() เป็นเวอร์ชันขั้นสูงของ del การใช้ nvidia-smi จะพบว่าหน่วยความจำวิดีโอมีการเปลี่ยนแปลงที่ชัดเจน อย่างไรก็ตามการใช้หน่วยความจำวิดีโอสูงสุดในระหว่างการฝึกอบรมดูเหมือนจะไม่เปลี่ยนแปลง คุณสามารถลอง: เราจะปล่อยแคชหน่วยความจำ GPU ได้อย่างไร - คุณสามารถใช้
del เพื่อลบตัวแปรกลางที่ไม่จำเป็นหรือใช้รูปแบบของ replacing variables เพื่อลดการเข้าพัก
การสะสมการไล่ระดับสี
แบ่ง batchsize=64 เป็นสองชุดของ 32 และหลังจากการส่งต่อสองครั้งย้อนหลังหนึ่งครั้ง แต่มันจะส่งผลกระทบต่อ batchnorm และเลเยอร์อื่น ๆ ที่เกี่ยวข้องกับ batchsize
ในเอกสารของ Pytorch ตัวอย่างของการใช้การสะสมการไล่ระดับสีและความแม่นยำในการผสมถูกกล่าวถึง
ใช้เทคโนโลยีการสะสมการไล่ระดับสีเพื่อเร่งการฝึกอบรมแบบกระจายซึ่งสามารถนำมาใช้เพื่ออ้างถึง: [ต้นฉบับ] [ลึก] [Pytorch] DDP Series 3: การปฏิบัติและทักษะ - 996 บทความจาก Golden Generation - Zhihu
จุดตรวจการไล่ระดับสี
torch.utils.checkpoint มีให้ใน Pytorch สิ่งนี้สามารถทำได้โดยการเผยแพร่ไปข้างหน้าอีกครั้งในแต่ละตำแหน่งจุดตรวจสอบในระหว่างการ backpropagation
การฝึกอบรมกระดาษอวนลึกที่มีค่าใช้จ่ายหน่วยความจำ sublinear ขึ้นอยู่กับเทคโนโลยีจุดตรวจสอบการไล่ระดับสีเพื่อลดหน่วยความจำวิดีโอจาก O (n) เป็น O (SQRT (N)) สำหรับรุ่นที่ลึกกว่านั้นหน่วยความจำวิธีนี้จะประหยัดได้มากขึ้นและไม่ช้าลงอย่างมีนัยสำคัญ
- การวิเคราะห์กลไกจุดตรวจของ Pytorch
- Torch.utils.CheckPoint บทนำและใช้งานง่าย
- การใช้ Pytorch ของค่าใช้จ่ายหน่วยความจำ sublinear อ้างอิงจาก: อะไรคือเคล็ดลับสำหรับการบันทึกหน่วยความจำ (หน่วยความจำวิดีโอ) ใน Pytorch? - คำตอบของ Lyken - Zhihu
เครื่องมือที่เกี่ยวข้อง
- รหัสเหล่านี้สามารถช่วยคุณตรวจจับหน่วยความจำ GPU ของคุณในระหว่างการฝึกด้วย pytorch https://github.com/oldpan/pytorch-memory-utils
- น้อยกว่า Nvidia-Smi? https://github.com/wookayin/gpustat
การอ้างอิง
- เคล็ดลับสำหรับการบันทึกหน่วยความจำ (หน่วยความจำวิดีโอ) ใน Pytorch คืออะไร? - คำตอบของเจิ้งเจ๋อ - zhihu
- การอภิปรายสั้น ๆ เกี่ยวกับการเรียนรู้อย่างลึกซึ้ง: วิธีการคำนวณรอยเท้าหน่วยความจำของแบบจำลองและตัวแปรระดับกลาง
- วิธีใช้หน่วยความจำวิดีโออย่างประณีตใน Pytorch
- เคล็ดลับในการบันทึกหน่วยความจำวิดีโอใน Pytorch คืออะไร? - คำตอบของเฉินแฮนเก - Zhihu
- การวิเคราะห์กลไกหน่วยความจำวิดีโอ Pytorch - บทความของ Connolly - Zhihu
เคล็ดลับอื่น ๆ
ทำซ้ำ
คุณสามารถทำตามบทที่เกี่ยวข้องในเอกสาร
การดำเนินงานที่กำหนด
หลีกเลี่ยงการใช้อัลกอริทึมแบบไม่ใช้งาน
ใน pytorch, torch.use_deterministic_algorithms() สามารถบังคับให้ใช้อัลกอริทึมที่กำหนดได้แทนที่จะเป็นอัลกอริทึมแบบไม่ใช้งาน
ตั้งค่าเมล็ดพันธุ์สุ่ม
def seed_torch ( seed = 1029 ):
random . seed ( seed )
os . environ [ 'PYTHONHASHSEED' ] = str ( seed )
np . random . seed ( seed )
torch . manual_seed ( seed )
torch . cuda . manual_seed ( seed )
torch . cuda . manual_seed_all ( seed ) # if you are using multi-GPU.
torch . backends . cudnn . benchmark = False
torch . backends . cudnn . deterministic = True
seed_torch () อ้างอิงจาก https://www.zdaiot.com/mlframeworks/pytorch/pytorch%E9%9a%8F%E6%9C%BA%E7%A7%8D%E5%AD%90/
Hidden Bug ใน Dataloader ก่อน Pytorch เวอร์ชัน 1.9
รายละเอียดเฉพาะแสดงให้เห็นว่า 95% ของผู้คนยังคงทำผิดพลาด Pytorch - บทความ Serendipity - Zhihu
สำหรับการแก้ปัญหาโปรดดูเอกสาร:
def seed_worker ( worker_id ):
worker_seed = torch . initial_seed () % 2 ** 32
numpy . random . seed ( worker_seed )
random . seed ( worker_seed )
DataLoader (..., worker_init_fn = seed_worker )