Multiprocessing Pool - sebagian besar pekerja dimuat tetapi masih menganggur

Dalam skrip python 2.7, kode multiprosesor pertama yang memproses sebagian besar array numpy. Ini pada dasarnya adalah blok bingkai sinar proyeksi antara bidang gambar dan bidang Cartesian (dunia). Bagian itu, yang disebut poo1, berfungsi dengan baik.

Lebih lanjut dalam skrip, saya mencoba mereproduksi kode multiprosesor untuk memproyeksikan banyak gambar dengan frameblock sinar proyeksi ini.

Tampaknya hanya 4 hingga 6 pekerja yang bekerja tetapi semuanya siap bekerja mengisi data. pool2 menciptakan pekerja, penggunaan memori mereka lambat, hanya 6 di antaranya yang menggunakan daya CPU.

Tangkapan layar: Pekerja yang tidak bekerja selama multiprosesing

Catatan:

  • Tidak ada output yang didapat dari fungsi multi-proses, output jika file ditulis dalam folder;
  • Jangan khawatir tentang masalah ukuran memori, tersedia setengah TB;
  • Jangan khawatir tentang urutan prosesnya;
  • Jumlah pekerja inti CPU fisik - 1 = 27;
  • Panjang daftar pekerjaan yang akan didistribusikan (paramsGeoRef) bisa dari 1 hingga 250 baris.

Info argumen:

  • Frameclock, ndarray masif, bisa GB
  • A1 : ndarray, bisa ratusan MB
  • A2 : ndarray, bisa ratusan MB
  • B1 : nilai bilangan bulat
  • B2 : nilai bilangan bulat
  • Nama file : string, nama
  • D1 : string, jalur
  • D2 : string, jalur
  • D3 : string, jalur
  • P1 : larik kecil
  • P2 : susunan kecil

Penyederhanaan kode terlihat seperti ini:

    def georef(paramsGeoRef):

        #Pseudo workflow
        """
        - unpack arguments, Frameclock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2 <== paramsGeoRef
        - Loading tif image
        - Evergy convertion
            with function and P1, P2
        - Proportional projection of the image
            - Frameclock, A1, A2
        - Evergy convertion
            with function and P1, P2
        - Figure creation
        - Geotiff creation
        - export into file figure, geotiff and numpy file
        """
        return None

if __name__ == '__main__':

    paramsGeoRef = []
    for im in imgfiles:
        paramsGeoRef.append([Frameclock, A1, A2, B1, B2, fileName, D1 , D2 , D3 , P1 , P2])
    if flag_parallel:
        cpus = multiprocessing.cpu_count()
        cpus = cpus - 1
        pool2 = multiprocessing.Pool(processes=cpus)
        pool2.map(georef, paramsGeoRef)
        pool2.close()
        pool2.join()

Saya mencoba pendekatan yang berbeda, seperti:

Bongkar argumen sebelumnya:

def star_georef(Frameclock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2):
    return georef(*paramsGeoRef)

def georef(paramsGeoRef):
    #Pseudo workflow...
    return None

Menggunakan jenis peta lain:

pool2.imap_unordered()

Apa yang salah? Mengapa metode ini berfungsi untuk mengolah array numpy, tetapi tidak untuk tujuan ini? Perlu menangani ukuran besar?

Mungkin, saya perlu memberi makan pekerja segera setelah mereka tersedia dengan generator pekerjaan?


person Alex C.    schedule 04.10.2019    source sumber
comment
Saya menduga hambatan tersebut terkait dengan meneruskan argumen Frameclock GB ke setiap proses. Mungkin lebih baik menjadikannya mmap dan meneruskannya untuk menghindari overhead yang terlibat (terlepas dari berapa banyak perangkat keras yang Anda gunakan).   -  person martineau    schedule 04.10.2019
comment
Saya menyimpan Frameclock, A1 dan A2 di .npy dengan numpy. Saya memuatnya di georef sebagai gantinya. Peningkatan efisiensi yang drastis!!! Terima kasih   -  person Alex C.    schedule 09.10.2019
comment
Senang mendengarnya — sama-sama.   -  person martineau    schedule 09.10.2019
comment
Pertanyaan : Menggunakan memmap (np.memmap) dapatkah lebih efisien daripada acar seperti.npy ? Khususnya bila Anda menggunakan ratusan MB ndarray.   -  person Alex C.    schedule 10.10.2019
comment
Ya, menggunakan peta memori akan secara efektif memungkinkan pembagian data antar proses — itulah alasan saya awalnya menyarankan untuk menggunakannya.   -  person martineau    schedule 10.10.2019


Jawaban (1)


Mengikuti saran Martineau,

Saya menyimpan argumen Frameclock, A1 dan A2 dengan numpy dalam format .npy. Lalu saya memuat .npy di dalam file .npy yang diparalelkan.

seperti :

def georef(paramsGeoRef):

    #Pseudo workflow
    """
    - unpack arguments, Frameblock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2 <== paramsGeoRef
    - load Frameblock from his .npy
    - load A1 from his .npy
    - load A2 from his .npy
    - Loading tif image
    - Evergy convertion
        with function and P1, P2
    - Proportional projection of the image
        - Frameclock, A1, A2
    - Evergy convertion
        with function and P1, P2
    - Figure creation
    - Geotiff creation
    - export into file figure, geotiff and numpy file
    """
    return None

Bahkan dengan menyimpan dan memuat, ini merupakan peningkatan efisiensi yang drastis! Semua pekerja bekerja.

person Alex C.    schedule 09.10.2019