SORU
26 Mart 2013, Salı


Neden çoklu numpy ben aldıktan sonra sadece tek bir çekirdek kullanıyor mu?

Bu daha OS bir sorun olarak sayılır mı emin değilim, ama herkes için Python sonuna gelen bazı bilgiler vardır diye burada sorayım dedim.

Ben denedim parallelise bir CPU-ağır for döngü kullanarak joblib ama ben bulmak yerine her alt süreç olarak atanan farklı bir çekirdek, ben sonunda hepsiyle olmaktan atanan aynı çekirdek ve hiçbir performans kazancı.

İşte bu çok ufak bir örnek...

from joblib import Parallel,delayed
import numpy as np

def testfunc(data):
    # some very boneheaded CPU work
    for nn in xrange(1000):
        for ii in data[0,:]:
            for jj in data[1,:]:
                ii*jj

def run(niter=10):
    data = (np.random.randn(2,100) for ii in xrange(niter))
    pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
    results = pool(delayed(testfunc)(dd) for dd in data)

if __name__ == '__main__':
    run()

...ve burada bu komut çalışırken: htop içinde ne olduğunu görüyorum

htop

Ubuntu 12.10 (3.5.0-26) 4 çekirdekli bir dizüstü bilgisayarda çalışan biriyim. joblib.Parallel farklı çalışanlar için ayrı işlemler yumurtlama olduğunu açıkça, ama bu işler farklı çekirdekleri üzerinde işlem yapmak için herhangi bir yolu var mı?

CEVAP
26 Mart 2013, Salı


Daha googling biraz sonra cevap here buldum.

Bazı Python modülleri (*, scipy, , *, *13tables*12 9*...*) alma konusunda çekirdek yakınlığı ile karışıklık çıkıyor. Söyleyebileceğim kadarıyla, bu sorun özellikle çok iş parçacıklı OpenBLAS kütüphaneler karşı onları birbirine bağlayan yol açtığı gibi görünüyor.

Geçici bir çözüm görev benzeşme kullanarak sıfırlamak için

os.system("taskset -p 0xff %d" % os.getpid())

Bu hat modülü alır sonra yapıştırılan, benim örnek şimdi tüm çekirdek çalışır:

htop_workaround

Benim deneyim şimdiye kadar bu numpyBu muhtemelen makine ve göreve özel olmasına rağmen.'nın performansı üzerinde herhangi bir olumsuz etkisi görünmüyor olmuştur

Güncelleme:

Ayrıca CPU benzeşme-sıfırlama OpenBLAS kendisi davranışı devre dışı bırakmak için iki yol vardır. -Zamanında çevreye örneğin OPENBLAS_MAIN_FREE (ya da GOTOBLAS_MAIN_FREE), değişken kullanabilirsiniz

OPENBLAS_MAIN_FREE=1 python myscript.py

Veya alternatif olarak, eğer kaynaktan derlemek OpenBLAS eğer kalıcı olarak Makefile.rule düzenleyerek yapı-zaman çizgisi içeren devre dışı bırakabilirsiniz

NO_AFFINITY=1

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LiveForGodsKingdom

    LiveForGodsK

    6 NİSAN 2008
  • Drakinen

    Drakinen

    1 EYLÜL 2008
  • TheScorpioTechno

    TheScorpioTe

    15 Aralık 2010