有没有办法并行运行多个 ONNX 模型并使用多个可用内核?
\n目前,我已经训练了两个 ONNX 模型,并想使用它们进行推断。我已经使用了 Python 的线程,但这并没有\xe2\x80\x99 真正使用多核。
\n之后我尝试了多重处理,但这给了我以下错误:
\n\n\n无法pickle onnxruntime.capi.onnxruntime_pybind11_state.SessionOptions对象
\n
请告诉我是否有任何解决方法?
\npython parallel-processing multithreading multiprocessing onnxruntime
我有一个简单的默认 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) 以下是使用 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
我正在尝试与一个 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 秒)?将脚本拆分为两个脚本不是一个选项。
这是[如何使用一个 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 新手]
我的问题是如何利用 iMac 的多个核心来使 gganimate 运行得更快。还有另一个问题(更多链接在下面)询问同样的事情\xe2\x80\x94我的问题是关于这个问题的答案:加速 gganimate Rendering。
\n在该答案中,Roman 和 mhovd 指出了此GitHub 评论中的一个示例(另请参阅此 GitHub 帖子):
\nlibrary(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)\nRun Code Online (Sandbox Code Playgroud)\n我已经尝试过这个,但得到的时间彼此非常接近:
\n user system elapsed \n1.0041475 0.9775679 0.9995509 \nRun Code Online (Sandbox Code Playgroud)\n除了这段代码之外,我还需要做些什么吗?根据上述 StackOverflow 答案或 GitHub 页面,我无法判断这段代码是否应该按原样工作,或者是否在幕后进行了其他修改。
\n如果有帮助的话,我正在使用配备 8 核 Intel 处理器的 iMac。我也在 R 中运行它,因为 RStudio 说了一些关于它不支持多核的内容。
\n另请注意,我的问题也广泛涉及这三个过去的问题:
\n …第一次在这里提问。请善待:)
我试图以并行方式递归地获取所有目录,希望减少遍历驱动器所需的时间。下面是我尝试过的代码。本质上我想要做的是输入一个文件夹并对其子文件夹及其子文件夹等并行执行相同的操作,但该函数在并行块内无法识别
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) 由于 NumPy 的转置函数,我目前遇到了巨大的开销。我发现这个函数实际上总是在单线程中运行,无论转置矩阵/数组有多大。我可能需要避免这种巨大的时间成本。
\n据我了解,np.dot如果 numpy 数组足够大,其他函数(例如向量增量)将并行运行。一些按元素操作似乎在 numexpr 包中可以更好地并行化,但 numexpr 可能无法处理转置。
我想了解解决问题的更好方法。为了详细说明这个问题,
\nB = A.T),因为转置后的张量不用于计算或转储,并且在此阶段不需要真正转置数据。调用时B[:] = A.T,确实会转置数据。在此先感谢您的任何建议!
\n在我的 Linux 个人计算机上处理模型转置问题(大小约为A763MB),可用 4 核(总共 400% CPU)。
A = np.random.random((9999, 10001))\nB = np.random.random((10001, 9999))\nD = np.random.random((9999, 10001))\nRun Code Online (Sandbox Code Playgroud)\n当前的解决方法似乎不够有效。一般来说,如果在 4 核 CPU 上完全并行化,它应该会看到大约 3 倍~4 倍的加速,但我编写的代码只获得了大约 1.5 倍。 …
我正在开发 R 包,并且需要myfun使用parallel::parLapply. myfun调用我的包中的几个附加函数,这些函数又调用更多函数,其中一些函数有多个方法......因此按名称显式将所有函数和方法传递到集群非常麻烦。
据我了解,标准建议是跑步
parallel::clusterEvalQ({library("my_package")})。但对 R-CMD-check 的调用library("my_package")显然是令人厌恶的。我有理由相信这my-package:::function也不会在 CRAN 上运行。
这里的标准方法是什么?我需要按名称导出每个相关函数和方法吗?
我有一个相对简单的案例:
棘手的部分是更新需要“原子地”发生,这样它就不会从本地状态读取,例如,只写入了一半的更新。状态不限于使用原语,并且可以包含任意类 AFAICT atm,因此我无法通过使用Interlocked原子操作之类的简单方法来解决它。我计划在其自己的线程上运行每个任务,因此在本例中总共有两个线程。
为了实现这个目标,我想使用双缓冲区技术,其中:
这是这个想法的总体要点,但实际的实现当然会有点不同。
我试图查找这是否是一个常见的解决方案,但找不到太多信息,所以这让我想知道以下内容:
我几乎觉得我已经走进了一个死胡同,我找不到(因为我不知道要搜索什么)更多的资源和信息来看看这种方法是否“好”。我计划用 .NET C# 编写此内容,但我认为这些技术和解决方案可以转换为任何语言。所有见解均受到赞赏。
c# parallel-processing concurrency multithreading multiprocessing
c# ×2
python ×2
r ×2
slurm ×2
concurrency ×1
generative-adversarial-network ×1
gganimate ×1
ggplot2 ×1
keras ×1
macos ×1
multi-gpu ×1
numpy ×1
onnxruntime ×1
powershell ×1
r-package ×1
semaphore ×1
tensorflow ×1
transpose ×1
webview2 ×1