PySpark için çalışma zamanında yapılandırmayı değiştirme

oy
2

PySpark'a eğitimli bir Faiss endeksi dağıtmaya ve dağıtılmış bir arama yapmaya çalışıyordum. Yani tüm süreç şunları içerir:

  1. Ön işlem
  2. Başarısızlık İndeksini Yükle (~ 15G) ve Hatalı Arama Yap
  3. İşlem sonrası ve HDFS'ye yazma

Görev başına CPU'ları 10 olarak ayarladım ( spark.task.cpus=10 ). Ancak adım 1 ve adım 3 görev başına yalnızca 1 CPU kullanabilir. Ayarlamak istediğim tüm CPU'ları kullanmak için spark.task.cpus=1 adım 1 ve 3'ten önce RuntimeConfig ama öyle görünüyor ki programım sıkıştı. Çalışma zamanında yapılandırma nasıl değiştirilir veya bu sorunu nasıl optimize edersiniz?

Kod örneği:

def load_and_search(x, model_path):
    faiss_idx = faiss.read_index(model_path)
    q_vec = np.concatenate(x)
    _, idx_array = faiss_idx.search(q_vec, k=10)
    return idx_array


data = sc.textFile(input_path)

# preprocess, only used one cpu per task
data = data.map(lambda x: x)

# load faiss index and search, used multiple cpus per task
data = data.mapPartitioins(lambda x: load_and_search(x, model_path))

# postprocess and write, one cpu per task
data = data.map(lambda x: x).saveAsTextFile(result_path)
Oluştur 26/04/2020 saat 10:00
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Alternatif fikir: kullanım mapPartitions Ardından, bölümdeki öğeleri paralel olarak eşlemek için her bir çalışanın içinde çok işlemcili bir havuz kullanın. Bu şekilde, bir işçiye atanan tüm cpus'ları yapılandırmayı değiştirmeden kullanabilirsiniz (ki bunun mümkün olup olmadığını bilmiyorum).

pseudocode:

def item_mapper(item):
    return ...

def partition_mapper(partition):
    pool = mp.Pool(processes=10)
    yield from pool.imap(partition, item_mapper)

rdd.mapPartitions(partition_mapper)
Cevap 13/05/2020 saat 10:59
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more