scikit-Learn พารามิเตอร์ n_jobs เกี่ยวกับการใช้งาน CPU และหน่วยความจำ


12

ในประมาณมากที่สุดใน scikit การเรียนรู้ที่มีn_jobsพารามิเตอร์ในfit/ วิธีการสำหรับการสร้างงานโดยใช้แบบคู่ขนานpredict joblibฉันสังเกตเห็นว่าการตั้งค่าให้-1สร้างกระบวนการ Python เพียง 1 กระบวนการและใช้แกนประมวลผลสูงสุดทำให้การใช้งาน CPU สูงถึง 2,500% ที่ด้านบน สิ่งนี้ค่อนข้างแตกต่างจากการตั้งค่าเป็นจำนวนเต็มบวก> 1 ซึ่งสร้างกระบวนการ Python หลายกระบวนการที่การใช้งาน ~ 100%

การตั้งค่านี้มีผลต่อการใช้งาน CPU & core อย่างไรบนเซิร์ฟเวอร์ multi-CPU Linux (เช่นถ้าn_jobs=8เป็น 8 ซีพียูถูกล็อคอย่างสมบูรณ์หรือซีพียูยังคงจองคอร์บางส่วนสำหรับงาน / กระบวนการอื่น ๆ ?)

นอกจากนี้ฉันจะได้รับMemoryErrorเป็นครั้งคราวเมื่อตั้งค่าn_jobs=-1ชุดข้อมูลขนาดใหญ่ อย่างไรก็ตามการใช้หน่วยความจำมักจะวนเวียนอยู่ที่ประมาณ 30-40% สำหรับกระบวนการ Python เดียว ข้อมูลและหน่วยความจำมีการจัดการ / คัดลอกอย่างไรขึ้นอยู่กับมูลค่าของn_jobs?


1
จำไว้ว่าคุณสามารถตั้งค่าเป็น -2 ซึ่งจะใช้ทั้งหมดยกเว้น 1 แกนที่มีอยู่ทำให้เครื่องของคุณทำงานได้อย่างน้อย ค่อนข้างถูกต้องว่าปัญหาหน่วยความจำมักจะเริ่มกัดหาหลายคอร์โดยเฉพาะอย่างยิ่งถ้าชุดข้อมูลมีขนาดใหญ่
Ken Syme

คำตอบ:


4

ฉันสามารถจินตนาการถึงคุณค่าของการ-1ใช้ทรัพยากรที่มีอยู่ทั้งหมดและเมื่อมันพร้อมใช้งาน ขึ้นอยู่กับฟังก์ชั่นที่คุณกำลังพูดถึงดูเหมือนว่าข้อมูลจะถูกคัดลอกสำหรับงานแต่ละงานซึ่งอาจนำไปสู่ปัญหาหน่วยความจำหากชุดข้อมูลมีขนาดใหญ่พอ นี่เป็นตัวอย่างข้อมูลจาก docstring ของGridSearchCV :

If `n_jobs` was set to a value higher than one, the data is copied for each
point in the grid (and not `n_jobs` times). This is done for efficiency
reasons if individual jobs take very little time, but may raise errors if
the dataset is large and not enough memory is available.  A workaround in
this case is to set `pre_dispatch`. Then, the memory is copied only
`pre_dispatch` many times. A reasonable value for `pre_dispatch` is `2 *
n_jobs`.

ดังนั้นจึงเป็นความคิดที่ดีที่จะใช้pre_dispatchเพื่อ จำกัด การใช้หน่วยความจำของคุณ

มิฉะนั้นคุณตั้งค่าเป็น-1ทำไม คุณควรตั้งค่าเป็นจำนวนแกนประมวลผลทางกายภาพบนเครื่องของคุณหรืออาจเป็น 2 เท่าของจำนวนนั้นหากงานสามารถเป็นแบบมัลติเธรด

แก้ไข:

ดูเหมือนว่าการตั้งค่าn_jobs=-1ไม่เพียงแค่เลือกแกนประมวลผลทั้งหมดและเพิ่มการใช้งานให้สูงสุด มีลักษณะที่แสดงความคิดเห็นในคำตอบนี้ใน StackOverflow

หากคุณยังไม่ได้ตั้งค่าpre_dispatchแน่นอนจะพยายามคัดลอกจำนวนมาก นี่คือสาเหตุที่คุณมีหน่วยความจำไม่เพียงพอ หากคุณมี 4 คอร์จะมีชุดข้อมูลที่ทำไว้ 8 ชุด (ตามที่อธิบายไว้ข้างต้นในเครื่องหมายคำพูด)

นี่คือเธรดอื่นซึ่งดูเพิ่มเติมที่ด้านประสิทธิภาพ


1
ดังนั้นเราจึงใช้ pre_dispatch เพื่อ จำกัด การคัดลอกข้อมูล แต่ทำไมตั้งค่าเป็น -1 จึงมีปัญหาหน่วยความจำ

1
@sweetyBaby - โปรดดูลิงก์ที่เพิ่มเข้ามา การตั้งค่าn_jobs = -1จะไม่นำคุณไปสู่การพิจารณาของหน่วยความจำเพียงจำนวนแกนใน CPU ของคุณซึ่งแน่นอนสามารถนำไปสู่ปัญหาหน่วยความจำ
n1k31t4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.