小编use*_*974的帖子

为什么使用 std::async 的并发性比使用 std::thread 更快?

我正在阅读关于并发的“现代 C++ 编程手册,第 2 版”的第 8 章,偶然发现了一些让我感到困惑的东西。

作者使用std::thread和实现了不同版本的并行映射和缩减功能std::async。实现非常接近;例如,parallel_map函数的核心是

// parallel_map using std::async
...
tasks.emplace_back(std::async(
  std::launch::async,
  [=, &f] {std::transform(begin, last, begin, std::forward<F>(f)); }));
...

// parallel_map using std::thread
...
threads.emplace_back([=, &f] {std::transform(begin, last, begin, std::forward<F>(f)); });
...
Run Code Online (Sandbox Code Playgroud)

完整的代码可以发现这里std::thread那里std::async

让我感到困惑的是,书中报告的计算时间为std::async实现提供了显着且一致的优势。此外,作者承认这一事实是显而易见的,但没有提供任何理由的暗示:

如果我们将这个 [result with async] 与使用线程的并行版本的结果进行比较,我们会发现这些是更快的执行时间并且加速非常显着,尤其是对于fold函数。

我在我的电脑上运行了上面的代码,尽管差异没有书中那么引人注目,但我发现std::async实现确实比那个更快std::thread。(作者后来还带来了这些算法的标准实现,它们甚至更快)。在我的计算机上,该代码以四个线程运行,这与我的 CPU 的物理内核数相对应。

也许我错过了一些东西,但为什么明显std::async应该比std::thread这个例子运行得更快?我的直觉是,std::async作为线程的更高级别实现,它应该至少花费与线程相同的时间,如果不是更多的话——显然我错了。这些发现是否如书中所建议的那样一致,其解释是什么?

c++ multithreading

25
推荐指数
1
解决办法
536
查看次数

tf.train.init_from_checkpoint不会初始化使用tf.Variable创建的变量

似乎是tf.train.init_from_checkpoint初始化通过 创建的变量,tf.get_variable不是通过创建的变量tf.Variable

例如,让我们创建两个变量并保存它们:

import tensorflow as tf

tf.Variable(1.0, name='foo')
tf.get_variable('bar',initializer=1.0)
saver = tf.train.Saver()
with tf.Session() as sess:
  tf.global_variables_initializer().run()
  saver.save(sess, './model', global_step=0)
Run Code Online (Sandbox Code Playgroud)

如果我再次通过加载它们tf.train.Saver,则一切正常:即使变量在此处初始化为零,变量也将重新加载为1:

import tensorflow as tf

foo = tf.Variable(0.0, name='foo')
bar = tf.get_variable('bar', initializer=0.0)
saver = tf.train.Saver()
with tf.Session() as sess:
  saver.restore(sess, './model-0')
  print(f'foo: {foo.eval()}  bar: {bar.eval()}')
  # foo: 1.0  bar: 1.0
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用tf.train.init_from_checkpoint我得到

import tensorflow as tf

foo = tf.Variable(0.0, name='foo')
bar = tf.get_variable('bar', initializer=0.0)
tf.train.init_from_checkpoint('./model-0', {'/':'/'})
with …
Run Code Online (Sandbox Code Playgroud)

python tensorflow

11
推荐指数
1
解决办法
1346
查看次数

Tensorflow 1.11需要CuDNN 7.2用于CUDA 9.0,但是没有这样的库

要求的tensorflow 1.11的当前版本在GPU上运行的是

  • CUDA®Toolkit-TensorFlow支持CUDA 9.0.
  • cuDNN SDK(> = 7.2)

但是,CuDNN downlad页面仅列出

下载cuDNN v7.2.1(2018年8月7日),CUDA 9.2

鉴于CuDNN带有不同的二进制文件,用于CUDA工具包的次要修订(例如,CuDNN 7.1.3有一个用于CUDA 9.1的二进制文件,另一个用于CUDA 9.0),我认为这个CuDNN 7.2的二进制文件与CUDA 9.0不兼容.

是文档错误吗?如果没有,如何满足TF 1.11的要求?

tensorflow cudnn

9
推荐指数
1
解决办法
9384
查看次数

如何协调上下文管理器与 Jupyter Notebook 的基于单元格的执行风格?

像 Jupyter 这样的笔记本将交互式执行分割成单元格。一般来说,这对我来说效果很好,但有一个明显的例外:上下文管理器。如果我打开一条with语句,单元格的末尾将关闭上下文,上下文管理器将退出。

假设我的笔记本处理从 DBMS 获取的数据。我通常会使用上下文管理器来管理与数据库的连接并管理游标以自动提交或回滚事务。但是在建立连接后,我的整个代码需要位于单个单元格中。

解决方法是使用上下文管理器,上下文管理器可以帮助我们防止潜在的陷阱。在我看来,当单元可以(确实)以任何顺序执行时,这个问题在笔记本中会被放大。在我的 DBMS 示例中,由于建立连接的单元被多次执行,因此可以打开与数据库的多个连接而无需关闭。此外,它们甚至可能不是上下文管理器的“内联”版本,例如,当上下文管理器是修饰函数时@contextlib.contextmanager,尽管我没有在我使用的任何主要库中看到这种情况发生。

我可能只是在咆哮,但是有没有办法让上下文管理器单元执行友好?或者我们是否只能使用短命的上下文管理器,否则就只能依靠我们自己?

python contextmanager jupyter-notebook

9
推荐指数
1
解决办法
1244
查看次数

static_rnn和dynamic_rnn有什么区别?

在tensorflow中,tf.nn.static_rnn和和有什么区别tf.nn.dynamic_rnn?何时使用它们?

两者都采用sequence_length使计算适应输入的实际长度的参数。好像static_rnn不限于固定大小的输入,对吗?

dynamic_rnn 具有以下额外参数:

  • parallel_iterations
  • swap_memory
  • time_major

但是我想这些只是微小的差异。

所以之间的主要区别是什么tf.nn.static_rnntf.nn.dynamic_rnn我们何时应该使用一个比其他?

python tensorflow

6
推荐指数
1
解决办法
3228
查看次数

Jax、jit 和动态形状:Tensorflow 的回归?

JAX 的文档说,

并非所有 JAX 代码都可以进行 JIT 编译,因为它要求数组形状是静态的且在编译时已知。

现在我有点惊讶,因为 TensorFlow 具有类似的操作,tf.boolean_mask而 JAX 在编译时似乎无法执行此操作。

  1. 为什么 Tensorflow 会出现这样的回归?我假设底层 XLA 表示在两个框架之间共享,但我可能是错的。我不记得 Tensorflow 在动态形状和函数方面遇到过麻烦,比如tf.boolean_mask一直存在的问题。
  2. 我们可以预期这种差距在未来会缩小吗?如果不是,为什么在 JAX' jit 中无法实现 Tensorflow(以及其他)所支持的功能?

编辑

梯度通过tf.boolean_mask(显然不是在掩码值上,掩码值是离散的);这里使用 TF1 样式图的例子,其中值未知,因此 TF 不能依赖它们:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

x1 = tf.placeholder(tf.float32, (3,))
x2 = tf.placeholder(tf.float32, (3,))
y = tf.boolean_mask(x1, x2 > 0)
print(y.shape)  # prints "(?,)"
dydx1, dydx2 = tf.gradients(y, [x1, x2])
assert dydx1 is not None and dydx2 is None
Run Code Online (Sandbox Code Playgroud)

python tensorflow jax

6
推荐指数
1
解决办法
1968
查看次数

通过 conda-forge 安装 tensorflow-gpu 会导致使用仅限 CPU 的 tensorflow

我正在创建一个 conda 环境,仅用于使用频道中的tensorflow-gpuconda-forge

conda create -n tst -c conda-forge tensorflow-gpu
Run Code Online (Sandbox Code Playgroud)

这会导致安装tensorflow-gpu tensorflow包:

The following NEW packages will be INSTALLED:

    _tflow_1100_select: 0.0.1-gpu
    ...
    tensorboard:        1.10.0-py36_0         conda-forge
    tensorflow:         1.10.0-py36_0         conda-forge
    tensorflow-gpu:     1.10.0-hf154084_0
    ...
Run Code Online (Sandbox Code Playgroud)

然后当我导入 tensorflow 时,它看不到 GPU:

>>> import tensorflow as tf
>>> tf.test.is_gpu_available()
2018-09-20 15:29:21.778708: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
False
Run Code Online (Sandbox Code Playgroud)

问题:

  • 为什么当只需要前者时,conda 会同时安装tensorflow-gputensorflow包?
  • 两个包可以和平共存,如果可以,如何在两者之间切换?
  • 加分项:为什么从主渠道安装时一切正常,即conda create -n tst …

python conda tensorflow

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

PyCharm w/ conda 中的“ImportError: DLL load failed”:如何自动导入 conda 的 PATH?

我已经通过 conda 安装了 python,创建了一个新环境,安装了 PyCharm 并将其配置为使用该环境。

\n\n

当我在 PyCharm 中启动 python 控制台时,我看到了

\n\n
\n

C:\\ Users \\ 9973879 \\ AppData \\ Local \\ Continuum \\ miniconda3 \\ envs \\ foo \\ lib \\ site-packages \\ IPython \\ core \\ history.py:226:用户警告: IPython历史记录需要SQLite,您的历史记录将不会被保存

\n
\n\n

事实上,如果我尝试import sqlite3,我会得到

\n\n
\n

ImportError: DLL 加载失败: 找不到指定的模块。

\n
\n\n

然而Project Interpreters > Interpreter Paths确实列出了C:\\Users\\9973879\\AppData\\Local\\Continuum\\miniconda3\\envs\\foo\\{DLLs, Lib, site-packages}。此外,从同一虚拟环境 \xe2\x80\x94 中的命令行 \xe2\x80\x94 启动的 python 解释器导入此包也会成功。

\n\n

编辑

\n\n

看来问题出在PATH环境变量上。调用时conda activate …

python pycharm conda

5
推荐指数
2
解决办法
6741
查看次数

关于 OpenCV 调整 INTER_AREA 工作域大小的问题 (func != 0 &amp;&amp; cn &lt;= 4 in function 'cv::hal::resize' failure)

resize我对使用插值时OpenCV 函数的工作范围有疑问INTER_AREA。以下是三种不同的插值:

import cv2
import numpy as np

cv2.resize(np.zeros((17, 99, 99), dtype=np.uint8), (64, 32), interpolation=cv2.INTER_AREA)
# OK
cv2.resize(np.zeros((200, 64, 4), dtype=np.uint8), (64, 32), interpolation=cv2.INTER_AREA)
# OK
cv2.resize(np.zeros((200, 64, 64), dtype=np.uint8), (64, 32), interpolation=cv2.INTER_AREA)
# error: OpenCV(4.1.1) ..\modules\imgproc\src\resize.cpp:3557: error: (-215:Assertion failed) func != 0 && cn <= 4 in function 'cv::hal::resize'
Run Code Online (Sandbox Code Playgroud)

前两个工作正常,但最后一个失败。为什么会这样呢?什么样的输入/输出形状组合是可以接受的?

(请注意,该问题特定于INTER_AREA,因为其他插值方案似乎适用于所有三种情况)。

python opencv downsampling

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

如何在自动运行的情况之外手动运行 GitLab CI 管道?

我想要一个需要在每个合并请求时运行的管道。我还希望能够手动运行该管道,以便可以预见合并问题。

但是,如果我将我的工作指定为

only:
  - merge_requests
Run Code Online (Sandbox Code Playgroud)

当尝试手动运行管道时,我遇到了一个

管道无法运行。此管道没有阶段/作业。

如果我改用工作流程,

include:
  - template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
Run Code Online (Sandbox Code Playgroud)

迎接我的是不同但同等的

管道无法运行。按工作流规则过滤掉的管道。

那么,如何设置合并请求所需的管道,但也可以由用户在其功能分支上手动运行?

gitlab gitlab-ci

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