我正在阅读关于并发的“现代 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
作为线程的更高级别实现,它应该至少花费与线程相同的时间,如果不是更多的话——显然我错了。这些发现是否如书中所建议的那样一致,其解释是什么?
似乎是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) 该要求的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的要求?
像 Jupyter 这样的笔记本将交互式执行分割成单元格。一般来说,这对我来说效果很好,但有一个明显的例外:上下文管理器。如果我打开一条with
语句,单元格的末尾将关闭上下文,上下文管理器将退出。
假设我的笔记本处理从 DBMS 获取的数据。我通常会使用上下文管理器来管理与数据库的连接并管理游标以自动提交或回滚事务。但是在建立连接后,我的整个代码需要位于单个单元格中。
解决方法是不使用上下文管理器,上下文管理器可以帮助我们防止潜在的陷阱。在我看来,当单元可以(确实)以任何顺序执行时,这个问题在笔记本中会被放大。在我的 DBMS 示例中,由于建立连接的单元被多次执行,因此可以打开与数据库的多个连接而无需关闭。此外,它们甚至可能不是上下文管理器的“内联”版本,例如,当上下文管理器是修饰函数时@contextlib.contextmanager
,尽管我没有在我使用的任何主要库中看到这种情况发生。
我可能只是在咆哮,但是有没有办法让上下文管理器单元执行友好?或者我们是否只能使用短命的上下文管理器,否则就只能依靠我们自己?
在tensorflow中,tf.nn.static_rnn
和和有什么区别tf.nn.dynamic_rnn
?何时使用它们?
两者都采用sequence_length
使计算适应输入的实际长度的参数。好像static_rnn
不限于固定大小的输入,对吗?
dynamic_rnn
具有以下额外参数:
parallel_iterations
swap_memory
time_major
但是我想这些只是微小的差异。
所以之间的主要区别是什么tf.nn.static_rnn
和tf.nn.dynamic_rnn
我们何时应该使用一个比其他?
JAX 的文档说,
并非所有 JAX 代码都可以进行 JIT 编译,因为它要求数组形状是静态的且在编译时已知。
现在我有点惊讶,因为 TensorFlow 具有类似的操作,tf.boolean_mask
而 JAX 在编译时似乎无法执行此操作。
tf.boolean_mask
一直存在的问题。编辑
梯度通过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) 我正在创建一个 conda 环境,仅用于使用频道中的tensorflow-gpu
包conda-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)
问题:
tensorflow-gpu
和tensorflow
包?conda create -n tst …
我已经通过 conda 安装了 python,创建了一个新环境,安装了 PyCharm 并将其配置为使用该环境。
\n\n当我在 PyCharm 中启动 python 控制台时,我看到了
\n\n\n\n\nC:\\ Users \\ 9973879 \\ AppData \\ Local \\ Continuum \\ miniconda3 \\ envs \\ foo \\ lib \\ site-packages \\ IPython \\ core \\ history.py:226:用户警告: IPython历史记录需要SQLite,您的历史记录将不会被保存
\n
事实上,如果我尝试import sqlite3
,我会得到
\n\n\nImportError: DLL 加载失败: 找不到指定的模块。
\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看来问题出在PATH
环境变量上。调用时conda activate …
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
,因为其他插值方案似乎适用于所有三种情况)。
我想要一个需要在每个合并请求时运行的管道。我还希望能够手动运行该管道,以便可以预见合并问题。
但是,如果我将我的工作指定为
only:
- merge_requests
Run Code Online (Sandbox Code Playgroud)
当尝试手动运行管道时,我遇到了一个
管道无法运行。此管道没有阶段/作业。
如果我改用工作流程,
include:
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
Run Code Online (Sandbox Code Playgroud)
迎接我的是不同但同等的
管道无法运行。按工作流规则过滤掉的管道。
那么,如何设置合并请求所需的管道,但也可以由用户在其功能分支上手动运行?