Změna konfigurace za běhu pro PySpark

hlasů
2

Snažil jsem se nasadit vyškolený Faissův index do PySparku a provést distribuované vyhledávání. Celý proces tedy zahrnuje:

  1. Předběžný proces
  2. Načtěte Faissův index (~ 15G) a proveďte Faiss Search
  3. Následné zpracování a zápis na HDFS

Nastavil jsem CPU na úkol jako 10 ( spark.task.cpus=10 ), abyste mohli vyhledávat ve více vláknech. Krok 1 a krok 3 však mohou využívat pouze 1 CPU na úkol. Abych mohl využít všechny procesory, které chci nastavit spark.task.cpus=1 před kroky 1 a 3. Zkusil jsem nastavit metodu RuntimeConfig ale zdá se, že můj program uvízl. Nějaké rady, jak změnit konfiguraci za běhu nebo jak optimalizovat tento problém?

Příklad kódu:

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)
Položena 26/04/2020 v 10:00
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Alternativní nápad: použití mapPartitions pro kroky 1 a 3. Poté pomocí víceprocesového fondu v rámci každého pracovníka mapujte položky v oddílu paralelně. Tímto způsobem můžete použít veškerý cpus přiřazený pracovníkovi bez změny konfigurace (což nevím, jestli je to vůbec možné).

Pseudo kód:

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)
Odpovězeno 13/05/2020 v 10:59
zdroj uživatelem

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