使用 mapPartitions 时,binaryFiles 何时加载到内存中?
When do binaryFiles load into memory when mapPartitions is used?
我正在使用 PySpark 将经过训练的深度学习模型应用于图像,并且关心内存使用量将如何根据我当前的方法进行扩展。因为经过训练的模型需要一段时间才能加载,所以我使用类似于以下的代码在每个 worker 上处理大批量图像:
def run_eval(file_generator):
trained_model = load_model()
results = []
for file in file_generator:
# "file" is a tuple: [0] is its filename, [1] is the byte data
results.append(trained_model.eval(file[1]))
return(results)
my_rdd = sc.binaryFiles('adl://my_file_path/*.png').repartition(num_workers)
results = my_rdd.mapPartitions(run_eval)
results.collect()
如上所述,文件存储在关联的 HDFS 文件系统(特别是 Azure Data Lake Store)中,可以通过 SparkContext 访问该文件系统。
我的主要问题是:
- 图像数据何时加载到内存中?
- 生成器递增时是否加载了每个图像的数据("just in time")?
- worker 启动前是否加载了整个分区的所有图像数据?
- 是头节点负责从该关联文件系统加载数据(可能造成瓶颈),还是工作人员从中加载自己的数据?
也感谢您就在哪里可以找到这些深入讨论的主题提出的建议。
When is the image data being loaded into memory?
- Is each image's data loaded when the generator increments ("just in time")?
实际上,鉴于您的代码,它必须加载不止一次。它首先被 JVM 访问,然后转换为 Python 类型。之后发生随机播放并再次加载数据。每个进程都是惰性的,所以加载不是问题。
所以你要问自己的第一个问题是你是否真的需要洗牌。 binaryFiles
有 minPartitions
参数,可用于控制分区数。
另一个问题是non-lazyresults
list
。使用生成器表达式会更有意义:
def run_eval(file_generator):
trained_model = load_model()
for file in file_generator:
yield trained_model.eval(file[1])
Is the head node responsible for loading the data from this associated file system (potentially creating a bottleneck), or do workers load their own data from it?
不涉及中央处理。每个执行程序进程(Python)/线程(JVM)将加载自己的数据集部分。
我正在使用 PySpark 将经过训练的深度学习模型应用于图像,并且关心内存使用量将如何根据我当前的方法进行扩展。因为经过训练的模型需要一段时间才能加载,所以我使用类似于以下的代码在每个 worker 上处理大批量图像:
def run_eval(file_generator):
trained_model = load_model()
results = []
for file in file_generator:
# "file" is a tuple: [0] is its filename, [1] is the byte data
results.append(trained_model.eval(file[1]))
return(results)
my_rdd = sc.binaryFiles('adl://my_file_path/*.png').repartition(num_workers)
results = my_rdd.mapPartitions(run_eval)
results.collect()
如上所述,文件存储在关联的 HDFS 文件系统(特别是 Azure Data Lake Store)中,可以通过 SparkContext 访问该文件系统。
我的主要问题是:
- 图像数据何时加载到内存中?
- 生成器递增时是否加载了每个图像的数据("just in time")?
- worker 启动前是否加载了整个分区的所有图像数据?
- 是头节点负责从该关联文件系统加载数据(可能造成瓶颈),还是工作人员从中加载自己的数据?
也感谢您就在哪里可以找到这些深入讨论的主题提出的建议。
When is the image data being loaded into memory?
- Is each image's data loaded when the generator increments ("just in time")?
实际上,鉴于您的代码,它必须加载不止一次。它首先被 JVM 访问,然后转换为 Python 类型。之后发生随机播放并再次加载数据。每个进程都是惰性的,所以加载不是问题。
所以你要问自己的第一个问题是你是否真的需要洗牌。 binaryFiles
有 minPartitions
参数,可用于控制分区数。
另一个问题是non-lazyresults
list
。使用生成器表达式会更有意义:
def run_eval(file_generator):
trained_model = load_model()
for file in file_generator:
yield trained_model.eval(file[1])
Is the head node responsible for loading the data from this associated file system (potentially creating a bottleneck), or do workers load their own data from it?
不涉及中央处理。每个执行程序进程(Python)/线程(JVM)将加载自己的数据集部分。