Skip to main content
  • Place orders quickly and easily
  • View orders and track your shipping status
  • Enjoy members-only rewards and discounts
  • Create and access a list of your products

เทคนิคการเพิ่มประสิทธิภาพสําหรับการฝึกอบรม CheXNet บน Dell C4140 ด้วย GPUs Nvidia V100

Summary: แนวทางปฏิบัติที่ดีที่สุดเพื่อให้ได้ประสิทธิภาพสูงสุดในการฝึกอบรม CheXNet แบบกระจายโดยใช้ GPUs Nvidia V100 SXM2 ในเซิร์ฟเวอร์ Dell EMC C4140

This article applies to This article does not apply to This article is not tied to any specific product. Not all product versions are identified in this article.

Symptoms

บทความเขียนโดย รักชิต วาซูเดฟ > จอห์น ล็อคแมน - ห้องปฏิบัติการนวัตกรรม HPC AI ในเดือนตุลาคม 2019

Cause

  -

Resolution

ตามที่แนะนํา ก่อนหน้านี้CheXNet เป็นรุ่นผู้ช่วยนักรังสีวิทยา AI ที่ใช้ DenseNet เพื่อระบุโรคได้ถึง 14 โรคจากภาพรังสีเอกซ์ที่หน้าอกที่กําหนด มีการสํารวจหลายแนวทางเพื่อขยายการฝึกอบรมโมเดลที่สามารถทํางานได้ดีและดีกว่า CheXNet-121 ดั้งเดิมด้วย ResNet-50 แสดงให้เห็นถึงคํามั่นสัญญาทั้งในความยืดหยุ่นและความแม่นยําในการฝึกอบรมที่เพิ่มขึ้น (AUROC เชิงบวก) ผู้เขียนแสดงให้เห็นถึงความสามารถในการปรับขนาดในระบบ CPU แต่เราสนใจที่จะใช้ประโยชน์จากความขนานของ GPUs เพื่อเร่งกระบวนการฝึกอบรม ในบทความนี้เราจะอธิบายแนวทางปฏิบัติที่ดีที่สุดเพื่อให้ได้ประสิทธิภาพสูงสุดในการฝึกอบรม CheXNet แบบกระจายโดยใช้ GPUs Nvidia V100 SXM2 ในเซิร์ฟเวอร์ Dell EMC C4140 Dell EMC PowerEdge C4140 ให้ทั้งความหนาแน่นและ ประสิทธิภาพ ด้วย GPUs Nvidia V100 สี่ตัวในการกําหนดค่า SXM2


 

การกําหนดค่าฮาร์ดแวร์: การกําหนดค่าซอฟต์แวร์:
  • 4 เพาเวอร์เอดจ์ C4140
  • 4 นิวิเดีย V100 32GB SXM2
  • 2 20 แกน Intel (R) Xeon (R) ทอง 6148 ซีพียู @ 2.40GHz
  • แรม 384 GB, DDR4 2666MHz
  • 1 เมลลาน็อกซ์ EDR HCA
  • ระบบไฟล์เงา
  • กรอบการเรียนรู้เชิงลึก: เทนสอร์โฟลว์-gpu
  • เวอร์ชันของเฟรมเวิร์ก: 1.12.0
  • รุ่นโฮโรวด์: 0.16.4
  • รุ่น MPI: 4.0.0 พร้อมการสนับสนุน cuda และ ucx
  • รุ่น CUDA: 10.1.105
  • รุ่น CUDNN: 7.6.0
  • รุ่น NCCL: 2.4.7
  • รุ่นงูหลาม: 3.6.8
  • ระบบปฏิบัติการและเวอร์ชัน: RHEL 7.4


 


ไปป์ไลน์ข้อมูลมีความสําคัญต่อการเพิ่มประสิทธิภาพสูงสุดจากส่วนช่วยดําเนินการของคุณ:



 

ข้อมูล tf คืออะไรทําไมคุณควรพยายามใช้มัน?

 

เนื่องจากอุปกรณ์คอมพิวเตอร์ใหม่ (เช่น GPUs และ TPUs) ทําให้สามารถฝึกเครือข่ายประสาทในอัตราที่รวดเร็วมากขึ้นการประมวลผล CPU มีแนวโน้มที่จะกลายเป็นคอขวด tf.data API ให้ผู้ใช้มีแบบเอกสารสําเร็จรูปในการออกแบบไปป์ไลน์อินพุตที่ใช้ CPU อย่างมีประสิทธิภาพเพิ่มประสิทธิภาพแต่ละขั้นตอนของกระบวนการ ETL

 

เมื่อต้องการดําเนินการขั้นตอนการฝึกอบรม ก่อนอื่นคุณต้องแยกและแปลงข้อมูลการฝึกอบรม แล้วป้อนข้อมูลนั้นให้เป็นแบบจําลองที่ทํางานบนคันเร่ง อย่างไรก็ตามในการใช้งานแบบซิงโครนัสที่ไร้เดียงสาในขณะที่ CPU กําลังเตรียมข้อมูลตัวเร่งกําลังนั่งใช้งาน ในทางกลับกันในขณะที่คันเร่งกําลังฝึกรุ่น CPU กําลังนั่งว่าง เวลาขั้นตอนการฝึกอบรมจึงเป็นผลรวมของทั้งเวลาการประมวลผลล่วงหน้าของ CPU และเวลาการฝึกอบรมคันเร่ง

 

การวางท่อ ทับซ้อนกับการประมวลผลเบื้องต้นและการดําเนินการแบบจําลองของขั้นตอนการฝึกอบรม ในขณะที่ส่วนช่วยดําเนินการขั้นตอนการฝึกอบรม N CPU กําลังเตรียมข้อมูลสําหรับขั้นตอนที่ N +1 การทําเช่นนี้จะช่วยลดเวลาขั้นตอนให้สูงสุด (เมื่อเทียบกับผลรวม) ของการฝึกอบรมและเวลาที่ใช้ในการแยกและแปลงข้อมูล

 

โดยไม่ต้องวางท่อ CPU และ GPU / TPU ไม่ได้ใช้งานเป็นส่วนใหญ่:

การดําเนินการSLN318898_en_US__1Sequantial
รูปที่ 1: การดําเนินการตามลําดับมักจะทําให้ GPU ไม่ได้ใช้งาน

 

ด้วยท่อเวลาว่างลดลงอย่างมีนัยสําคัญ:

SLN318898_en_US__2Pipeliningทับซ้อนกัน
รูปที่ 2: การวางท่อทับซ้อนกันกับการใช้งาน CPU และ GPU เพิ่มการใช้ GPU ให้สูงสุด

 

Tf.data API มีกลไกการวางท่อซอฟต์แวร์ผ่านการแปลง tf.data.Dataset.prefetch ซึ่งสามารถใช้เพื่อแยกข้อมูลเวลาที่ผลิตจากเวลาที่ใช้ โดยเฉพาะอย่างยิ่งการแปลงใช้เธรดพื้นหลังและบัฟเฟอร์ภายในเพื่อดึงข้อมูลล่วงหน้าจากชุดข้อมูลอินพุตก่อนเวลาที่ร้องขอ

 

ข้อมูลเพิ่มเติมที่นี่: https://www.tensorflow.org/guide/performance/datasets

 

เมื่อเป็นไปตามแนวทางที่จัดทําโดย tensorflow เป็นไปได้ที่จะได้รับไปป์ไลน์ข้อมูลที่มีลักษณะเช่นนี้ (แนวทางเก่า):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py

 

ในวิธีนี้เรียกอีกอย่างว่าวิธีการเก่าไปป์ไลน์ข้อมูล tf ทําดังต่อไปนี้ (สมมติว่าชุดข้อมูล x ray หน้าอกเป็นลําดับของ TFRecords):

 

  1. รับรายการชื่อแฟ้มแบบสัมบูรณ์
  2. สร้างชุดข้อมูลจากรายการชื่อแฟ้มโดยใช้ TFRecordDataset()
  3. สร้างชุดข้อมูลใหม่ที่โหลดและจัดรูปแบบรูปภาพโดยการประมวลผลเบื้องต้น
  4. ส่วนชุดข้อมูล
  5. สลับชุดข้อมูลเมื่อฝึก
  6. ทําซ้ําชุดข้อมูล
  7. แบทช์ชุดข้อมูล
  8. ดึงข้อมูลสําหรับbatch_sizeล่วงหน้า


 

อย่างไรก็ตามนี่ไม่ใช่รหัสที่มีประสิทธิภาพมากที่สุด มันทําให้เกิดแผงลอยและการใช้ gpu บ่อย 0% โดยทั่วไปมันไม่ได้ใช้คันเร่งอย่างมีประสิทธิภาพ

ในการตั้งค่าไปป์ไลน์ข้อมูล tf อย่างถูกต้องเราปฏิบัติตามวิธีการที่ดําเนินการโดยแบบจําลองอย่างเป็นทางการของ Tensorflow โดยเฉพาะรุ่นสําหรับ ResNet  ความแตกต่างระหว่างวิธีการเก่าและวิธีการใหม่คือวิธีการตั้งค่าไปป์ไลน์ข้อมูลก่อนที่จะป้อนให้กับแบบจําลอง

 

นี่คือลักษณะของวิธีการใหม่:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py

 

วิธีการรูปแบบอย่างเป็นทางการของ TensorFlow หรือที่เรียกว่าวิธีการใหม่มีดังนี้:

 

  1. รับรายการชื่อแฟ้มแบบสัมบูรณ์
  2. สร้างชุดข้อมูลจากรายการชื่อแฟ้มโดยใช้ from_tensor_slices()
  3. การต่อเวลาจะทําก่อนเวลา
  4. ชุดข้อมูลจะถูกสลับระหว่างการฝึกอบรม
  5. ชุดข้อมูลจะถูกแทรกคู่ขนานซึ่งกําลังแทรกแซงและประมวลผลไฟล์หลายไฟล์ (กําหนดโดย cycle_length) เพื่อแปลงชุดข้อมูลเพื่อสร้างชุดข้อมูล TFRecord
  6. ชุดข้อมูลจะถูกดึงข้อมูลไว้ล่วงหน้า buffer_sizeจะกําหนดจํานวนเรกคอร์ดที่จะมีการวางแผนล่วงหน้า ซึ่งโดยปกติจะเป็นbatch_sizeขนาดเล็กของงาน
  7. ชุดข้อมูลถูกสับเปลี่ยนอีกครั้ง รายละเอียดของการสับเปลี่ยนจะถูกควบคุมโดยbuffer_size
  8. ชุดข้อมูลถูกทําซ้ํา  มันทําซ้ําชุดข้อมูลจนกว่าจะnum_epochsฝึกอบรม
  9. ชุดข้อมูลอยู่ภายใต้map_and_batch () พร้อมกันซึ่งแยกวิเคราะห์ไฟล์บันทึก tf ซึ่งจะประมวลผลภาพล่วงหน้าและแบทช์
  10. ภาพที่ประมวลผลเบื้องต้นพร้อมเป็นชุดข้อมูลและตั้งค่าล่วงหน้าอีกครั้ง


 

นี่คือการเปรียบเทียบประสิทธิภาพของวิธีการทั้งเก่าและใหม่โดยใช้รุ่นอย่างเป็นทางการของ TF

SLN318898_en_US__3image(12053)
รูปที่ 3: ด้วยวิธีการใหม่คาดว่าจะใกล้เคียงกับการปรับขนาดเชิงเส้น

 

อย่างที่เห็นมีประสิทธิภาพสูงและไม่มีการปรับขนาดเลยด้วยวิธีการเก่า GPUs มักจะพบการใช้งานเพียงเล็กน้อยหรือไม่มีเลยทําให้ประสิทธิภาพการทํางานราบเรียบ การทําให้การคํานวณมีประสิทธิภาพมากขึ้นใน GPU หนึ่งตัวหมายถึงการทําให้การคํานวณมีประสิทธิภาพมากขึ้นใน GPU หลายตัวในหลายโหนดหากการสื่อสารได้รับการจัดการอย่างดี
การมีซีพียูทําการประมวลผลล่วงหน้าแบบขนานการดึงข้อมูลที่ประมวลผลในหน่วยความจํา & GPUs ที่ทําการยกการคูณเมทริกซ์อย่างหนักด้วยการสื่อสารที่รวดเร็วเป็นอีกแง่มุมหนึ่งที่ทําให้วิธีการใหม่นี้น่าสนใจยิ่งขึ้นในการปรับขนาดสําหรับมัลติโหนด


 


เทคนิคอื่น ๆ ที่ต้องดูเพื่อให้ได้ประสิทธิภาพที่ดีที่สุด:



 

การมีสภาพแวดล้อมที่ถูกต้องเป็นสิ่งสําคัญ:

 

สภาพแวดล้อมที่ดําเนินงานของคุณมีความสําคัญเท่ากับงานของคุณเนื่องจากการมีไลบรารี / โมดูลที่เหมาะสมมีความสําคัญเนื่องจากจะส่งผลกระทบต่อประสิทธิภาพการฝึกอบรม นอกจากนี้การมีไลบรารีที่เกี่ยวข้องกับ CUDA ล่าสุดสามารถช่วยปรับปรุงประสิทธิภาพได้

ทําตามบทช่วยสอนนี้เพื่อติดตั้งหากคุณไม่มีการตั้งค่าสภาพแวดล้อมการทํางาน



 

การใช้พารามิเตอร์การผูกที่ถูกต้องสําหรับ MPI:

 

MPI เป็นไลบรารีการสื่อสารที่ช่วย horovod เพื่อแจกจ่ายงาน มีการสํารวจตัวเลือกพารามิเตอร์การผูกและการแมปที่แตกต่างกันและพารามิเตอร์ที่ดีที่สุดสําหรับ C4140 คือการแมปโดยซ็อกเก็ต การตั้งค่าที่แนะนํามีดังนี้:
mpirun --map-by socket -np x python pyfile.py --pyoptions



 

ตรวจสอบให้แน่ใจว่ากระบวนการหนึ่งดําเนินการกับ GPU หนึ่งรายการ:

 

หากมีกระบวนการมากกว่าหนึ่งกระบวนการที่ทํางาน GPU หนึ่งกระบวนการพวกเขาอาจต่อสู้เพื่อทรัพยากร GPU ใช้หน่วยความจํา GPU และไม่เหมาะสมกับภาพต่อชุดอย่างมีประสิทธิภาพจึงรับผิดชอบในการทําให้ประสิทธิภาพของ GPU ได้รับความนิยม Tensorflow 1.13.1 ถูกสํารวจ แต่ดูเหมือนว่ามันมีข้อบกพร่องในเวลานั้น มันเปิดตัวมากกว่าหนึ่งกระบวนการต่อ GPU


 

โดยสรุป:

  • การตั้งค่าไปป์ไลน์ข้อมูลอย่างถูกต้องเป็นสิ่งสําคัญในการดูประสิทธิภาพที่เพิ่มขึ้น
  • การตั้งค่าสภาพแวดล้อมที่ถูกต้องเป็นปัจจัยที่ดีต่อประสิทธิภาพที่ดีขึ้น
  • การใช้พารามิเตอร์การผูกที่ถูกต้องสําหรับ MPI ช่วยในการปรับปรุงประสิทธิภาพ
  • โปรไฟล์และแก้ไขปัญหาคอขวดเมื่อ GPUs ไม่สามารถใช้งานได้อย่างเต็มที่


 


Affected Products

High Performance Computing Solution Resources, Poweredge C4140
Article Properties
Article Number: 000124384
Article Type: Solution
Last Modified: 17 Sep 2021
Version:  5
Find answers to your questions from other Dell users
Support Services
Check if your device is covered by Support Services.