TensorFlow ทำไมไพ ธ อนถึงภาษาที่เลือก?


143

ฉันเพิ่งเริ่มศึกษาการเรียนรู้อย่างลึกซึ้งและเทคนิค ML อื่น ๆ และฉันเริ่มค้นหากรอบที่ทำให้กระบวนการสร้างเน็ตและการฝึกอบรมนั้นง่ายขึ้นจากนั้นฉันพบ TensorFlow ซึ่งมีประสบการณ์น้อยในสนามสำหรับฉันดูเหมือนว่าความเร็วนั้นเป็น ปัจจัยใหญ่สำหรับการสร้างระบบ ML ที่ยิ่งใหญ่กว่าหากทำงานกับการเรียนรู้อย่างลึกซึ้งดังนั้นทำไม Google จึงเลือก python ให้สร้าง TensorFlow มันจะดีกว่าไหมถ้าจะทำให้มันเหนือภาษาที่สามารถรวบรวมและไม่ตีความ?

ข้อดีของการใช้ Python เหนือภาษาอย่าง C ++ สำหรับการเรียนรู้ของเครื่องคืออะไร


2
ผู้เยาว์ nitpick: การรวบรวมและการตีความไม่ตรงข้าม นอกจากนี้ภาษาการเขียนโปรแกรมใด ๆ อาจถูกนำไปใช้กับคอมไพเลอร์หรือกับล่ามหรือทั้งสองอย่าง มีคำตอบที่ดีเกี่ยวกับความแตกต่างในด้านวิศวกรรมซอฟต์แวร์
8bittree

คำตอบ:


240

สิ่งที่สำคัญที่สุดที่ต้องคำนึงถึงเกี่ยวกับ TensorFlow คือส่วนใหญ่แกนไม่ได้เขียนใน Python : มันเขียนด้วยการผสมผสานระหว่าง C ++ และ CUDA ที่ได้รับการปรับปรุงประสิทธิภาพสูงสุด (ภาษาของ Nvidia สำหรับการเขียนโปรแกรม GPU) ส่วนใหญ่เกิดขึ้นโดยใช้Eigen (ไลบรารีตัวเลข C ++ และ CUDA ประสิทธิภาพสูง) และcuDNN ของ NVidia (ไลบรารี DNN ที่ปรับให้เหมาะสมที่สุดสำหรับNVidia GPUsสำหรับฟังก์ชั่นเช่นconvolutions )

แบบจำลองสำหรับ TensorFlow คือโปรแกรมเมอร์ใช้ "ภาษาบางภาษา" (ส่วนใหญ่เป็น Python!) เพื่อแสดงโมเดล รุ่นนี้เขียนในโครงสร้าง TensorFlow เช่น:

h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...

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

จากนั้นโปรแกรมเมอร์จะ "ผลัก" การดำเนินการของแบบจำลองนี้โดยการดึงที่โหนด - สำหรับการฝึกอบรมซึ่งโดยปกติจะเป็น Python และสำหรับการให้บริการบางครั้งใน Python และบางครั้งใน C ++ แบบดิบ:

sess.run(eval_results)

Python (หรือการเรียกใช้ฟังก์ชัน C ++) อันนี้ใช้การเรียกระหว่างกระบวนการไปยัง C ++ หรือ RPCสำหรับรุ่นที่แจกจ่ายเพื่อโทรไปยังเซิร์ฟเวอร์ C ++ TensorFlow เพื่อบอกให้ดำเนินการแล้วคัดลอกผลลัพธ์กลับมา

ดังนั้นด้วยสิ่งที่กล่าวมาลองเติมคำถามอีกครั้ง: ทำไม TensorFlow จึงเลือก Python เป็นภาษาที่ได้รับการสนับสนุนเป็นอย่างแรกสำหรับการแสดงและควบคุมการฝึกอบรมของนางแบบ?

คำตอบนั้นง่าย: Python อาจเป็นภาษาที่สะดวกสบายที่สุดสำหรับนักวิทยาศาสตร์ข้อมูลจำนวนมากและผู้เชี่ยวชาญด้านการเรียนรู้ของเครื่องจักรซึ่งยังง่ายต่อการรวมและควบคุมแบ็คเอนด์ C ++ ในขณะเดียวกันก็เป็นคำทั่วไปที่ใช้กันอย่างแพร่หลายทั้งในและนอก ของ Google และโอเพนซอร์ส ด้วยรูปแบบพื้นฐานของ TensorFlow ประสิทธิภาพของ Python นั้นไม่สำคัญเลย มันเป็นข้อดีอย่างมากที่NumPyทำให้ง่ายต่อการประมวลผลล่วงหน้าใน Python และมีประสิทธิภาพสูงก่อนที่จะป้อนเข้าสู่ TensorFlow สำหรับสิ่งที่หนักหน่วงอย่างแท้จริงของ CPU

นอกจากนี้ยังมีความซับซ้อนมากมายในการแสดงแบบจำลองที่ไม่ได้ใช้เมื่อเรียกใช้งาน - การอนุมานรูปร่าง (เช่นถ้าคุณทำ matmul (A, B) รูปร่างของข้อมูลที่ได้จะเป็นอย่างไร) และการไล่ระดับสีอัตโนมัติการคำนวณการมันกลับกลายเป็นว่าเป็นเรื่องที่ดีมากที่จะสามารถแสดงสิ่งเหล่านั้นใน Python ได้ แต่ฉันคิดว่าในระยะยาวพวกเขาอาจจะย้ายไปที่แบ็กเอนด์ C ++ เพื่อเพิ่มภาษาอื่นให้ง่ายขึ้น

(ความหวังของหลักสูตรคือการสนับสนุนภาษาอื่น ๆ ในอนาคตสำหรับการสร้างและการแสดงรุ่นที่มันมีอยู่แล้วค่อนข้างตรงไปตรงมาเพื่อให้ทำงานได้อนุมานใช้ภาษาอื่น ๆ อีกหลาย -. c ++ ทำงานตอนนี้มีคนจาก Facebook มีส่วนไปผูกที่เรากำลังตรวจสอบในขณะนี้ ฯลฯ )


1
คุณจะนิยาม 'อนุมาน' ในIt's already quite straightforward to run inference using several other languagesการเป็นโปรแกรมเมอร์ Prolog ได้อย่างไรมันไม่เหมาะสำหรับฉัน มันดูเหมือนคำพูดนอกสถานที่
Guy Coder

1
วิ่งไปข้างหน้าของโมเดล นำไปใช้กับข้อมูลและการฝึกอบรม
dga

ด้วยการไปถึงการอนุมานรูปร่าง ฉันกำลังแปลงเครือข่ายประสาทบางส่วนเป็นภาษาที่พิมพ์แบบคงที่เพียงเพื่อการเรียนรู้ใช้เท่านั้นและการพิมพ์เป็ดใน Ptyhon ทำให้ส่วนหนึ่งของรหัสนั้นง่ายต่อการเขียน ในด้าน filp การเขียนโค้ด Python โดยไม่ต้องใช้ประเภททำให้มันยากขึ้นมากเมื่อเรียนรู้ Ptyhon เพื่อให้ได้ประเภทก่อนที่จะทำงาน ฉันเห็นข้อผิดพลาดรันไทม์จำนวนมากโดยใช้ Ptyhon กว่าภาษาอื่นซึ่งเป็น F # มันอาจจะคุ้มค่าที่จะสังเกตว่าเป็ดกำลังพิมพ์คำตอบ
Guy Coder

2
ในขณะที่เป็นจริงฉันคิดว่าการพิมพ์ของงูใหญ่เป็นเหตุผลทางอ้อม ภาษาที่ใช้กันทั่วไปใน Google --- quora.com/… --- Python เป็นการจับคู่ที่ดีที่สุดสำหรับการเรียนรู้ด้วยเครื่องจักรโดยเฉลี่ย ตัวเลือกจริงอื่น ๆ เท่านั้นที่จะเป็น C ++ (ฉันไม่รู้จักผู้คนมากมายที่ใช้ Lua, Torch ใช้ภาษา) และ C ++ นั้นค่อนข้างไกลจากเขตความสะดวกสบายของกล่องเครื่องมือ ML ML folks จำนวนมากมาจากภูมิหลังของ matlab พร้อมความนิยมที่เพิ่มขึ้น การพิมพ์เป็ดอาจเป็นสิ่งที่ได้รับความนิยมแน่นอน แต่มันเกินขอบเขตของฉัน
dga

ขอบคุณบทสรุปที่ดี ผู้ชาย Coder --- เป็นความรู้สึกของ "อนุมาน" ในการเล่นให้ดูบทความวิกิพีเดียอนุมานทางสถิติ มันอนุมานอุปนัยเมื่อเทียบกับชนิดนิรนัยที่ดำเนินการโดย Prolog
Bob Carpenter

35

TF ไม่ได้เขียนด้วยไพ ธ อน มันเขียนไว้ใน C ++ (และตัวเลขการใช้งานสูง performant ห้องสมุดและCUDA code) และคุณสามารถตรวจสอบได้โดยมองไปที่พวกเขาGitHub ดังนั้นแกนกลางไม่ได้เขียนในหลามแต่ TF ให้ส่วนต่อประสานกับภาษาอื่น ๆ อีกมากมาย ( python, C ++, Java, Go )

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณมาจากโลกการวิเคราะห์ข้อมูลคุณสามารถคิดถึงมันได้เช่น numpy (ไม่ได้เขียนด้วยภาษาไพ ธ อน แต่มีส่วนต่อประสานกับ Python) หรือถ้าคุณเป็นนักพัฒนาเว็บ - คิดว่ามันเป็นฐานข้อมูล (PostgreSQL, MySQL ซึ่ง สามารถเรียกใช้จาก Java, Python, PHP)


งูหลามส่วนหน้า (ภาษาที่คนเขียนรูปแบบใน TF) เป็นเนื่องจากนิยมมากที่สุดในหลาย เหตุผล ในความเห็นของฉันเหตุผลหลักคือประวัติศาสตร์: ผู้ใช้ ML ส่วนใหญ่ใช้งานแล้ว (ตัวเลือกยอดนิยมอื่น ๆ คือ R) ดังนั้นหากคุณจะไม่ให้ส่วนต่อประสานกับไพ ธ อนห้องสมุดของคุณอาจถึงกับคลุมเครือ


แต่การเขียนด้วยภาษาไพ ธ อนไม่ได้หมายความว่าแบบจำลองของคุณจะถูกดำเนินการในหลาม ในทางตรงกันข้ามถ้าคุณเขียนแบบจำลองของคุณอย่างถูกวิธีงูเหลือมไม่เคยถูกประหารชีวิตในระหว่างการประเมินกราฟ TF (ยกเว้นtf.py_func ()ซึ่งมีอยู่สำหรับการแก้ไขข้อบกพร่องและควรหลีกเลี่ยงในรูปแบบจริงเพราะจะถูกดำเนินการ ด้านไพ ธ อน)

สิ่งนี้แตกต่างจากตัวอย่างเช่น numpy ตัวอย่างเช่นถ้าคุณทำnp.linalg.eig(np.matmul(A, np.transpose(A))(ซึ่งก็คือeig(AA')) การดำเนินการจะคำนวณการแปลงเป็นภาษาที่รวดเร็ว (C ++ หรือ Fortran) ส่งคืนไปยังไพ ธ อนนำมาจากไพ ธ อนพร้อมกับ A และคำนวณการคูณในภาษาที่รวดเร็วและส่งกลับไป python จากนั้นคำนวณค่าลักษณะเฉพาะและส่งคืนไปยัง python ดังนั้นการดำเนินการที่มีราคาแพงอย่างเช่น matmul และ eig จะถูกคำนวณอย่างมีประสิทธิภาพคุณยังคงเสียเวลาโดยการย้ายผลลัพธ์ไปยังไพ ธ อนกลับและบังคับ TF ไม่ได้ทำเมื่อคุณกำหนดกราฟเทนเซอร์ของคุณไหลไม่ได้อยู่ในหลาม แต่ใน C ++ / CUDA / อย่างอื่น


ในบริบทนี้การโพสต์บล็อกของฉันอาจเป็นที่สนใจ: blog.ephorie.de/why-r-for-data-science-and-not-python
vonjd

4

Python อนุญาตให้คุณสร้างโมดูลส่วนขยายโดยใช้ C และ C ++ เชื่อมต่อกับรหัสเนทีฟและยังคงได้รับข้อดีที่ Python มอบให้คุณ

TensorFlow ใช้ Python, ใช่ แต่มันยังมีC ++ จำนวนมาก

สิ่งนี้ช่วยให้อินเทอร์เฟซที่เรียบง่ายกว่าสำหรับการทดลองโดยใช้ค่าใช้จ่ายของมนุษย์ที่มี Python น้อยลงและเพิ่มประสิทธิภาพด้วยการเขียนโปรแกรมส่วนที่สำคัญที่สุดใน C ++


0

อัตราส่วนล่าสุดที่คุณสามารถตรวจสอบได้จากที่นี่จะแสดงภายใน TensorFlow C ++ ใช้รหัสประมาณ 50% และ Python ใช้รหัสประมาณ 40%

ทั้ง C ++ และ Python เป็นภาษาทางการของ Google ดังนั้นจึงไม่น่าแปลกใจว่าทำไมถึงเป็นเช่นนั้น ถ้าฉันจะต้องจัดเตรียมการถดถอยอย่างรวดเร็วโดยที่ C ++ และ Python อยู่ ...

C ++ อยู่ในพีชคณิตการคำนวณและ Python ใช้สำหรับทุกอย่างรวมถึงการทดสอบ การรู้ว่าการทดสอบแพร่หลายไปได้อย่างไรในทุกวันนี้จึงไม่น่าแปลกใจว่าทำไมรหัสไพ ธ อนจึงมีส่วนสนับสนุน TF มาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.