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 

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