标签: parallel-processing

在 Python 中并行运行多个 ONNX 模型进行推理

有没有办法并行运行多个 ONNX 模型并使用多个可用内核?

\n

目前,我已经训练了两个 ONNX 模型,并想使用它们进行推断。我已经使用了 Python 的线程,但这并没有\xe2\x80\x99 真正使用多核。

\n

之后我尝试了多重处理,但这给了我以下错误:

\n
\n

无法pickle onnxruntime.capi.onnxruntime_pybind11_state.SessionOptions对象

\n
\n

请告诉我是否有任何解决方法?

\n

python parallel-processing multithreading multiprocessing onnxruntime

5
推荐指数
1
解决办法
2622
查看次数

在异步任务中并行使用 WebView2

我有一个简单的默认 Windows 桌面窗体,Form1带有一个按钮btn_Go作为测试。
我想运行多个并行的 WebView2 实例并处理渲染页面中的 html 代码。为了并行运行 WebView2,我使用 SemaphoreSlim(设置为并行 2)。另一个 SemaphoreSlim 用于等待 WebView2 渲染文档(有一些时间延迟)。

但我的代码落在await webBrowser.EnsureCoreWebView2Async();. WebView2实例中调试器的内部异常webBrowser是:

{"Cannot change thread mode after it is set. (Exception from HRESULT: 0x80010106 (RPC_E_CHANGED_MODE))"} System.Exception {System.Runtime.InteropServices.COMException}

如何并行多次调用 WebView2 并处理所有 url?

完整演示代码:

using Microsoft.Web.WebView2.WinForms;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WebView2Test
{
  public partial class Form1 : Form
  {
    public Form1() { InitializeComponent(); }

    private void btn_Go_Click(object sender, EventArgs e) …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing multithreading semaphore webview2

5
推荐指数
1
解决办法
3930
查看次数

如何使用 tf.strategy 修改 Keras CycleGAN 示例代码以在 GPU 上并行运行

以下是使用 Keras 的 Keras CycleGAN 示例中的 CycleGAN 示例

这是我修改后的使用多个 GPU 的实现。为了实现自定义训练,我使用了带有 tf.distribute.Strategy 的参考自定义训练

我想要一个来自 Keras 的 CycleGAN 示例,以便使用 GPU 快速运行。此外,我需要处理和训练大量数据。CycleGAN 使用多个损失函数train_step会返回 4 种损失,目前我只返回一种以便于理解。尽管如此,GPU 上的训练还是非常慢。我无法找到这背后的原因。

难道是我用tf.distribute.Strategy错了?

"""
Title: CycleGAN
Author: [A_K_Nain](https://twitter.com/A_K_Nain)
Date created: 2020/08/12
Last modified: 2020/08/12
Description: Implementation of CycleGAN.
"""

"""
## CycleGAN
CycleGAN is a model that aims to solve the image-to-image translation
problem. The goal of the image-to-image translation problem is to learn the
mapping between an input image and an …
Run Code Online (Sandbox Code Playgroud)

parallel-processing multi-gpu keras tensorflow generative-adversarial-network

5
推荐指数
0
解决办法
610
查看次数

如何使用一个 slurm 批处理脚本并行运行作业?

我正在尝试与一个 Slurm 批处理脚本并行运行多个 python 脚本。看一下下面的例子:

#!/bin/bash
#
#SBATCH --job-name=test
#SBATCH --output=/dev/null
#SBATCH --error=/dev/null
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=1
#SBATCH --mem-per-cpu=1G
#SBATCH --partition=All
#SBATCH --time=5:00

srun sleep 60
srun sleep 60
wait
Run Code Online (Sandbox Code Playgroud)

如何调整脚本以便执行仅需 60 秒(而不是 120 秒)?将脚本拆分为两个脚本不是一个选项。

parallel-processing slurm

5
推荐指数
1
解决办法
5062
查看次数

slurm 中的关键字 --exclusive 是什么意思?

这是[如何使用一个 slurm 批处理脚本并行运行作业?] 的后续问题。目标是创建一个 SBatch 脚本,它可以启动多个进程并并行运行它们。damienfrancois给出的答案 非常详细,看起来像这样。

#!/bin/bash
#
#SBATCH --job-name=test
#SBATCH --output=/dev/null
#SBATCH --error=/dev/null
#SBATCH --partition=All

srun -n 1 -c 1 --exclusive sleep 60 &
srun -n 1 -c 1 --exclusive sleep 60 &
....
wait
Run Code Online (Sandbox Code Playgroud)

但是,我无法理解Exclusive关键字。如果我使用该关键字,则会选择集群的一个节点,并在那里启动所有进程。但是,我希望 Slurm 将 [“sleeps”/steps] 分布在整个集群上。

那么关键字Exclusive是如何工作的呢?根据Slurm 文档,不应发生对一个节点的限制,因为该关键字是在一步分配中使用的。

[我是 Slurm 新手]

parallel-processing slurm

5
推荐指数
0
解决办法
6534
查看次数

如何使用多核使 gganimate 更快

我的问题是如何利用 iMac 的多个核心来使 gganimate 运行得更快。还有另一个问题(更多链接在下面)询问同样的事情\xe2\x80\x94我的问题是关于这个问题的答案加速 gganimate Rendering

\n

在该答案中,Roman 和 mhovd 指出了此GitHub 评论中的一个示例(另请参阅此 GitHub 帖子):

\n
library(gganimate)\nlibrary(future)\n\nanim <- ggplot(mtcars, aes(mpg, disp)) +\n  transition_states(gear, transition_length = 2, state_length = 1) +\n  enter_fade() +\n  exit_fade()\n\nfuture::plan("sequential")  ## default\nt0 <- system.time(animate(anim))\nprint(t0)\n\nfuture::plan("multiprocess", workers = 4L)\nt1 <- system.time(animate(anim))\nprint(t1)\n
Run Code Online (Sandbox Code Playgroud)\n

我已经尝试过这个,但得到的时间彼此非常接近:

\n
     user    system   elapsed \n1.0041475 0.9775679 0.9995509 \n
Run Code Online (Sandbox Code Playgroud)\n

除了这段代码之外,我还需要做些什么吗?根据上述 StackOverflow 答案或 GitHub 页面,我无法判断这段代码是否应该按原样工作,或者是否在幕后进行了其他修改。

\n

如果有帮助的话,我正在使用配备 8 核 Intel 处理器的 iMac。我也在 R 中运行它,因为 RStudio 说了一些关于它不支持多核的内容。

\n

另请注意,我的问题也广泛涉及这三个过去的问题:

\n …

parallel-processing macos r ggplot2 gganimate

5
推荐指数
1
解决办法
841
查看次数

在 ForEach-Object -Parallel 块内从自身递归调用函数 - 并行块内无法识别函数

第一次在这里提问。请善待:)

我试图以并行方式递归地获取所有目录,希望减少遍历驱动器所需的时间。下面是我尝试过的代码。本质上我想要做的是输入一个文件夹并对其子文件夹及其子文件夹等并行执行相同的操作,但该函数在并行块内无法识别

function New-RecursiveDirectoryList {
    [CmdletBinding()]
    param (
        # Specifies a path to one or more locations.
        [Parameter(Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Path to one or more locations.')]
        [Alias('PSPath')]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $Path
    )
    process {
        foreach ($aPath in $Path) {
            Get-Item $aPath

            Get-ChildItem -Path $aPath -Directory |
                # Recursively call itself in Parallel block not working
                # Getting error "The term 'New-RecursiveDirectoryList' is not recognized as a name of a cmdlet" …
Run Code Online (Sandbox Code Playgroud)

parallel-processing powershell foreach-object

5
推荐指数
1
解决办法
1258
查看次数

如何避免单线程NumPy转置的巨大开销?

由于 NumPy 的转置函数,我目前遇到了巨大的开销。我发现这个函数实际上总是在单线程中运行,无论转置矩阵/数组有多大。我可能需要避免这种巨大的时间成本。

\n

据我了解,np.dot如果 numpy 数组足够大,其他函数(例如向量增量)将并行运行。一些按元素操作似乎在 numexpr 包中可以更好地并行化,但 numexpr 可能无法处理转置。

\n

我想了解解决问题的更好方法。为了详细说明这个问题,

\n
    \n
  • 有时,NumPy 运行转置速度超快(如B = A.T),因为转置后的张量不用于计算或转储,并且在此阶段不需要真正转置数据。调用时B[:] = A.T,确实会转置数据。
  • \n
  • 我认为并行转置函数应该是一个解决方案。问题是如何实施。
  • \n
  • 希望该解决方案不需要 NumPy 以外的软件包。ctype 绑定是可以接受的。希望代码不会太难使用,也不会太复杂。
  • \n
  • 张量转置是一个优点。虽然转置矩阵的技术也可以用于特定的张量转置问题,但我认为为张量转置编写通用 API 可能很困难。我实际上还需要处理张量转置,但是处理张量可能会使这个 stackoverflow 问题复杂化。
  • \n
  • 未来是否有可能实现并行转置,或者是否有计划?那么就不需要自己实现转置了;)
  • \n
\n

在此先感谢您的任何建议!

\n
\n

当前的解决方法

\n

在我的 Linux 个人计算机上处​​理模型转置问题(大小约为A763MB),可用 4 核(总共 400% CPU)。

\n
A = np.random.random((9999, 10001))\nB = np.random.random((10001, 9999))\nD = np.random.random((9999, 10001))\n
Run Code Online (Sandbox Code Playgroud)\n

当前的解决方法似乎不够有效。一般来说,如果在 4 核 CPU 上完全并行化,它应该会看到大约 3 倍~4 倍的加速,但我编写的代码只获得了大约 1.5 倍。 …

python parallel-processing multithreading transpose numpy

5
推荐指数
1
解决办法
965
查看次数

R包设计:如何将内部函数导出到集群

我正在开发 R 包,并且需要myfun使用parallel::parLapply. myfun调用我的包中的几个附加函数,这些函数又调用更多函数,其中一些函数有多个方法......因此按名称显式将所有函数和方法传递到集群非常麻烦。

据我了解,标准建议是跑步 parallel::clusterEvalQ({library("my_package")})。但对 R-CMD-check 的调用library("my_package")显然是令人厌恶的。我有理由相信这my-package:::function也不会在 CRAN 上运行。

这里的标准方法是什么?我需要按名称导出每个相关函数和方法吗?

parallel-processing r r-package

5
推荐指数
1
解决办法
288
查看次数

使用双缓冲区技术进行并发读写?

我有一个相对简单的案例:

  1. 我的程序将通过 Websockets 接收更新,并将使用这些更新来更新其本地状态。这些更新将非常小(通常 < 1-1000 字节 JSON,因此反序列化 < 1 毫秒),但会非常频繁(高达 ~1000/s)。
  2. 同时,程序将从该本地状态读取/评估并输出其结果。
  3. 这两个任务应该并行运行,并且将在程序的持续时间内运行,即永远不会停止。
  4. 本地状态大小相对较小,因此内存使用量不是一个大问题。

棘手的部分是更新需要“原子地”发生,这样它就不会从本地状态读取,例如,只写入了一半的更新。状态不限于使用原语,并且可以包含任意类 AFAICT atm,因此我无法通过使用Interlocked原子操作之类的简单方法来解决它。我计划在其自己的线程上运行每个任务,因此在本例中总共有两个线程。

为了实现这个目标,我想使用双缓冲区技术,其中:

  1. 它保留状态的两份副本,以便在写入另一份时可以读取一份。
  2. 线程可以通过使用锁来传达它们正在使用哪个副本。即 Writer 线程在写入时锁定副本;读取器线程在完成当前副本后请求访问锁;编写器线程看到读取器线程正在使用它,因此它切换到其他副本。
  3. 写入线程会跟踪在当前副本上完成的状态更新,因此当它切换到另一个副本时,它可以“赶上”。

这是这个想法的总体要点,但实际的实现当然会有点不同。

我试图查找这是否是一个常见的解决方案,但找不到太多信息,所以这让我想知道以下内容:

  1. 它可行吗,还是我错过了什么?
  2. 有更好的方法吗?
  3. 这是一个通用的解决方案吗?如果有的话,通常被称为什么?
  4. (奖励)是否有一个好的资源可供我阅读与此相关的主题?

我几乎觉得我已经走进了一个死胡同,我找不到(因为我不知道要搜索什么)更多的资源和信息来看看这种方法是否“好”。我计划用 .NET C# 编写此内容,但我认为这些技术和解决方案可以转换为任何语言。所有见解均受到赞赏。

c# parallel-processing concurrency multithreading multiprocessing

5
推荐指数
1
解决办法
1235
查看次数