tensorflow เก็บข้อมูลการฝึกอบรมไว้ในหน่วยความจำ GPU

ฉันค่อนข้างใหม่กับเทนเซอร์โฟลว์ ฉันเคยใช้ theano เพื่อการพัฒนาการเรียนรู้เชิงลึก ฉันสังเกตเห็นความแตกต่างระหว่างสองสิ่งนี้ นั่นคือที่ที่สามารถจัดเก็บข้อมูลอินพุตได้

ใน Theano รองรับตัวแปรที่ใช้ร่วมกันเพื่อจัดเก็บข้อมูลอินพุตไว้ในหน่วยความจำ GPU เพื่อลดการถ่ายโอนข้อมูลระหว่าง CPU และ GPU

ในเทนเซอร์โฟลว์ เราจำเป็นต้องป้อนข้อมูลลงในตัวยึดตำแหน่ง และข้อมูลอาจมาจากหน่วยความจำ CPU หรือไฟล์

คำถามของฉันคือ: เป็นไปได้หรือไม่ที่จะจัดเก็บข้อมูลอินพุตไว้ในหน่วยความจำ GPU สำหรับเทนเซอร์โฟลว์ หรือมันทำไปแล้วด้วยวิธีมหัศจรรย์?

ขอบคุณ.


person xyd    schedule 02.06.2016    source แหล่งที่มา
comment
นี่คือตัวอย่างแบบเต็มของสิ่งนั้น -- mnist Fully_connected_preloaded .py   -  person Yaroslav Bulatov    schedule 02.06.2016
comment
@YaroslavBulatov ขอบคุณ!   -  person xyd    schedule 04.06.2016
comment
@YaroslavBulatov ไม่แน่ใจว่าคุณรู้หรือไม่ แต่รหัสที่คุณระบุดำเนินการหนึ่งยุคที่ 28 วินาทีซึ่งแย่มาก (แต่มันอยู่บน GPU) นอกจากนี้ ฉันไม่พบตัวอย่างเทนเซอร์โฟลว์ที่มีประสิทธิภาพดีสักตัวเดียวบนอินเทอร์เน็ต ซึ่งแปลกมากเมื่อเทียบกับเฟรมเวิร์กการเรียนรู้เชิงลึกอื่นๆ เช่น theano และ torch เป็นเพราะเทนเซอร์โฟลว์ช้ากว่าอันอื่นจริงหรือ? ถ้าไม่ ทำไมไม่มีใครจากผู้สร้างพยายามแก้ไขปัญหานี้ในขณะที่ผู้ใช้เทนเซอร์โฟลว์ใหม่ทั้งหมดบ่นเกี่ยวกับเรื่องนี้?   -  person zwlayer    schedule 03.10.2016
comment
Soumith Chintala มีเกณฑ์มาตรฐานพร้อมโค้ดที่เปรียบเทียบ tf ได้ดีกับ caffe/torch คุณสามารถเริ่มต้นด้วยโมเดลเหล่านั้น   -  person Yaroslav Bulatov    schedule 03.10.2016
comment
@zwlayer -- นี่คือลิงค์ไปยังการวัดประสิทธิภาพของ Convnets -- github.com/soumith/convnet-benchmarks . นอกจากนี้ ฉันย้ายสคริปต์ตัวอย่าง Torch lbfgs.lua ไปยัง TensorFlow และทำให้มันทำงานเร็วขึ้นด้วยแบทช์ขนาดเต็ม นี่คือการเปรียบเทียบ -- github.com/yaroslavvb/lbfgs การจับคู่ประสิทธิภาพในชุดข้อมูลขนาดเล็กนั้นยากกว่า เนื่องจาก TensorFlow ได้รับการออกแบบมาเพื่อปรับขนาดให้กับระบบแบบกระจาย/ชิปฮาร์ดแวร์ในอนาคต จึงมีทางอ้อมหลายระดับโดยมีค่าใช้จ่ายคงที่ซึ่งครอบงำในการคำนวณขนาดเล็ก IE สคริปต์ที่คูณ 2 ตัวเลขจะช้ากว่า 1,000 เท่าใน TF มากกว่าตัวเลข   -  person Yaroslav Bulatov    schedule 03.10.2016
comment
@YaroslavBulatov ขอบคุณสำหรับข้อมูลอันมีค่าทั้งหมดที่คุณให้ไว้   -  person zwlayer    schedule 03.10.2016
comment
@YaroslavBulatov ฉันรู้ว่านี่เป็นคำถามเก่า แต่การเปิด log_device_placement ในตัวอย่างแรกที่คุณลิงก์เพื่อแสดงว่าการดำเนินการเข้าคิวที่สร้างโดย tf.train.slice_producer อยู่บน CPU การจัดคิวสไลซ์บน CPU ดูเหมือนจะลบล้างข้อดีของการจัดเก็บข้อมูลบน GPU เนื่องจากสไลซ์จะถูกถ่ายโอนไปยัง CPU และด้านหลัง ฉันพลาดอะไรไปรึเปล่า?   -  person Tobias Hagge    schedule 19.10.2017
comment
คุณถูกต้อง คิวไม่รองรับ GPU เพื่อประสิทธิภาพที่ดีขึ้นบน GPU ให้ใช้ tf.data แทนคิว   -  person Yaroslav Bulatov    schedule 19.10.2017
comment
@YaroslavBulatov ตามข้อความแสดงข้อผิดพลาดของฉัน tf.data.Dataset.from_tensor_slices และฟังก์ชัน Iterator บางส่วนยังไม่มีเคอร์เนล GPU เช่นกัน นั่นคือวิธีที่ฉันลงเอยที่นี่   -  person Tobias Hagge    schedule 19.10.2017
comment
ฉันเห็น. ดูเหมือนว่าจะเป็นกรณีที่ไม่ปกติ โดยปกติแล้วการอ่านข้อมูลไม่ใช่ปัญหาคอขวด ดังนั้นข้อมูลจึงอยู่บน cpu   -  person Yaroslav Bulatov    schedule 19.10.2017


คำตอบ (2)


หากข้อมูลของคุณพอดีกับ GPU คุณสามารถโหลดลงในค่าคงที่บน GPU ได้เช่น อาร์เรย์จำนวนมาก:

with tf.device('/gpu:0'):
  tensorflow_dataset = tf.constant(numpy_dataset)

วิธีหนึ่งในการแยกมินิแบทช์คือการแบ่งอาร์เรย์นั้นในแต่ละขั้นตอนแทนที่จะป้อนโดยใช้ tf.slice< /ก>:

  batch = tf.slice(tensorflow_dataset, [index, 0], [batch_size, -1])

ธีมนั้นมีหลายรูปแบบที่เป็นไปได้ รวมถึงการใช้คิวเพื่อดึงข้อมูลล่วงหน้าไปยัง GPU แบบไดนามิก

person Vincent Vanhoucke    schedule 02.06.2016
comment
ขอบคุณมาก! ฉันจะตรวจสอบสิ่งนั้น - person xyd; 04.06.2016

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

ก่อนที่จะพยายามปรับโครงสร้างโค้ดใหม่เพื่อใช้พื้นที่เก็บข้อมูลบน GPU ให้ลองทำอย่างน้อยหนึ่งอย่างต่อไปนี้:

1) เริ่มต้นเซสชันของคุณด้วยการบันทึกตำแหน่งอุปกรณ์เพื่อบันทึกการดำเนินการใดที่ดำเนินการบนอุปกรณ์ใด:

config = tf.ConfigProto(log_device_placement=True)
sess = tf.Session(config=config)

2) ลองวางกราฟของคุณบน GPU ด้วยตนเองโดยใส่คำจำกัดความลงในบล็อก with tf.device('/gpu:0'): สิ่งนี้จะทำให้เกิดข้อยกเว้นหากการดำเนินการไม่รองรับ GPU

person Tobias Hagge    schedule 19.10.2017