บทความเขียนโดย รักชิต วาซูเดฟ > จอห์น ล็อคแมน - ห้องปฏิบัติการนวัตกรรม HPC AI ในเดือนตุลาคม 2019
ตามที่แนะนํา ก่อนหน้านี้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
การกําหนดค่าฮาร์ดแวร์: | การกําหนดค่าซอฟต์แวร์: |
---|---|
|
|
เนื่องจากอุปกรณ์คอมพิวเตอร์ใหม่ (เช่น GPUs และ TPUs) ทําให้สามารถฝึกเครือข่ายประสาทในอัตราที่รวดเร็วมากขึ้นการประมวลผล CPU มีแนวโน้มที่จะกลายเป็นคอขวด tf.data API ให้ผู้ใช้มีแบบเอกสารสําเร็จรูปในการออกแบบไปป์ไลน์อินพุตที่ใช้ CPU อย่างมีประสิทธิภาพเพิ่มประสิทธิภาพแต่ละขั้นตอนของกระบวนการ ETL
เมื่อต้องการดําเนินการขั้นตอนการฝึกอบรม ก่อนอื่นคุณต้องแยกและแปลงข้อมูลการฝึกอบรม แล้วป้อนข้อมูลนั้นให้เป็นแบบจําลองที่ทํางานบนคันเร่ง อย่างไรก็ตามในการใช้งานแบบซิงโครนัสที่ไร้เดียงสาในขณะที่ CPU กําลังเตรียมข้อมูลตัวเร่งกําลังนั่งใช้งาน ในทางกลับกันในขณะที่คันเร่งกําลังฝึกรุ่น CPU กําลังนั่งว่าง เวลาขั้นตอนการฝึกอบรมจึงเป็นผลรวมของทั้งเวลาการประมวลผลล่วงหน้าของ CPU และเวลาการฝึกอบรมคันเร่ง
การวางท่อ ทับซ้อนกับการประมวลผลเบื้องต้นและการดําเนินการแบบจําลองของขั้นตอนการฝึกอบรม ในขณะที่ส่วนช่วยดําเนินการขั้นตอนการฝึกอบรม N CPU กําลังเตรียมข้อมูลสําหรับขั้นตอนที่ N +1 การทําเช่นนี้จะช่วยลดเวลาขั้นตอนให้สูงสุด (เมื่อเทียบกับผลรวม) ของการฝึกอบรมและเวลาที่ใช้ในการแยกและแปลงข้อมูล
โดยไม่ต้องวางท่อ CPU และ GPU / TPU ไม่ได้ใช้งานเป็นส่วนใหญ่:
รูปที่ 1: การดําเนินการตามลําดับมักจะทําให้ GPU ไม่ได้ใช้งาน
ด้วยท่อเวลาว่างลดลงอย่างมีนัยสําคัญ:
รูปที่ 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):
อย่างไรก็ตามนี่ไม่ใช่รหัสที่มีประสิทธิภาพมากที่สุด มันทําให้เกิดแผงลอยและการใช้ gpu บ่อย 0% โดยทั่วไปมันไม่ได้ใช้คันเร่งอย่างมีประสิทธิภาพ
ในการตั้งค่าไปป์ไลน์ข้อมูล tf อย่างถูกต้องเราปฏิบัติตามวิธีการที่ดําเนินการโดยแบบจําลองอย่างเป็นทางการของ Tensorflow โดยเฉพาะรุ่นสําหรับ ResNet ความแตกต่างระหว่างวิธีการเก่าและวิธีการใหม่คือวิธีการตั้งค่าไปป์ไลน์ข้อมูลก่อนที่จะป้อนให้กับแบบจําลอง
นี่คือลักษณะของวิธีการใหม่:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py
วิธีการรูปแบบอย่างเป็นทางการของ TensorFlow หรือที่เรียกว่าวิธีการใหม่มีดังนี้:
นี่คือการเปรียบเทียบประสิทธิภาพของวิธีการทั้งเก่าและใหม่โดยใช้รุ่นอย่างเป็นทางการของ TF
รูปที่ 3: ด้วยวิธีการใหม่คาดว่าจะใกล้เคียงกับการปรับขนาดเชิงเส้น
อย่างที่เห็นมีประสิทธิภาพสูงและไม่มีการปรับขนาดเลยด้วยวิธีการเก่า GPUs มักจะพบการใช้งานเพียงเล็กน้อยหรือไม่มีเลยทําให้ประสิทธิภาพการทํางานราบเรียบ การทําให้การคํานวณมีประสิทธิภาพมากขึ้นใน GPU หนึ่งตัวหมายถึงการทําให้การคํานวณมีประสิทธิภาพมากขึ้นใน GPU หลายตัวในหลายโหนดหากการสื่อสารได้รับการจัดการอย่างดี
การมีซีพียูทําการประมวลผลล่วงหน้าแบบขนานการดึงข้อมูลที่ประมวลผลในหน่วยความจํา & GPUs ที่ทําการยกการคูณเมทริกซ์อย่างหนักด้วยการสื่อสารที่รวดเร็วเป็นอีกแง่มุมหนึ่งที่ทําให้วิธีการใหม่นี้น่าสนใจยิ่งขึ้นในการปรับขนาดสําหรับมัลติโหนด
สภาพแวดล้อมที่ดําเนินงานของคุณมีความสําคัญเท่ากับงานของคุณเนื่องจากการมีไลบรารี / โมดูลที่เหมาะสมมีความสําคัญเนื่องจากจะส่งผลกระทบต่อประสิทธิภาพการฝึกอบรม นอกจากนี้การมีไลบรารีที่เกี่ยวข้องกับ CUDA ล่าสุดสามารถช่วยปรับปรุงประสิทธิภาพได้
ทําตามบทช่วยสอนนี้เพื่อติดตั้งหากคุณไม่มีการตั้งค่าสภาพแวดล้อมการทํางาน
MPI เป็นไลบรารีการสื่อสารที่ช่วย horovod เพื่อแจกจ่ายงาน มีการสํารวจตัวเลือกพารามิเตอร์การผูกและการแมปที่แตกต่างกันและพารามิเตอร์ที่ดีที่สุดสําหรับ C4140 คือการแมปโดยซ็อกเก็ต การตั้งค่าที่แนะนํามีดังนี้:mpirun --map-by socket -np x python pyfile.py --pyoptions
หากมีกระบวนการมากกว่าหนึ่งกระบวนการที่ทํางาน GPU หนึ่งกระบวนการพวกเขาอาจต่อสู้เพื่อทรัพยากร GPU ใช้หน่วยความจํา GPU และไม่เหมาะสมกับภาพต่อชุดอย่างมีประสิทธิภาพจึงรับผิดชอบในการทําให้ประสิทธิภาพของ GPU ได้รับความนิยม Tensorflow 1.13.1 ถูกสํารวจ แต่ดูเหมือนว่ามันมีข้อบกพร่องในเวลานั้น มันเปิดตัวมากกว่าหนึ่งกระบวนการต่อ GPU
โดยสรุป: