<h2>过度限制的约束</h2>
<p>我敢说的问题是,从包含版本和构建的YAML中重新创建将使这些版本和构建成为该环境的<em>明确规范</em>。也就是说,Conda将显式规范视为硬需求,它不能改变,因此,如果为了使用版本11,即使是<code>cudatoolkit</code>的一个依赖项也需要更新,Conda将不知道如何在不违反之前指定的约束的情况下满足它</p>
<p>具体来说,这就是我在搜索时看到的(假设<strong>linux-64</strong>平台):</p>
<pre class="lang-bash prettyprint-override"><code>$ conda search info 'cudatoolkit[subdir="linux-64",version="11.1.*"]'
Loading channels: done
...
cudatoolkit 11.1.1 h6406543_8
-
file name : cudatoolkit-11.1.1-h6406543_8.tar.bz2
name : cudatoolkit
version : 11.1.1
build : h6406543_8
build number: 8
size : 1.20 GB
license : NVIDIA End User License Agreement
subdir : linux-64
url : https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.1.1-h6406543_8.tar.bz2
md5 : 4851e7f19b684e517dc8e6b5b375dda0
timestamp : 2021-02-12 16:31:01 UTC
constraints :
- __cuda >=11.1
dependencies:
- __glibc >=2.17,<3.0.a0
- libgcc-ng >=9.3.0
- libstdcxx-ng >=9.3.0
</code></pre>
<p>请注意依赖项与YAML规范之间的冲突。也就是说,YAML将<code>libgcc-ng</code>和<code>libstdcxx-ng</code>锁定到9.1.0版本,而<code>cudatoolkit==11.1.1</code>需要9.3.0或更高版本</p>
<h2>最小放松</h2>
<p>仅编辑上述规范即可。但是,没有简单的方法来判断这是否与其他内容冲突。不过值得一试。即,编辑YAML以使其具有:</p>
<pre class="lang-yaml prettyprint-override"><code>dependencies:
...
- cudatoolkit=11.1
- libgcc-ng
- libstdcxx-ng
...
</code></pre>
<p>考虑到去掉依赖项上的约束,让康达用任何可行的方法来解决它们</p>
<h2>自由约束</h2>
<p>导出环境的更自由的方法是使用<code> from-history</code>标志:</p>
<pre class="lang-bash prettyprint-override"><code>conda env export from-history -n VAE180 > VAE180.minimal.yaml
</code></pre>
<p>这将仅从用户历史中导出显式约束,其中可能包括也可能不包括版本和构建,具体取决于用户最初创建环境的方式。通常,它的约束远小于默认导出将生成的约束。然后可以编辑这个YAML,使其具有<code>cudatoolkit=11.1</code>,然后尝试使用它创建环境</p>
<p>这种方法的缺点是,许多其他软件包可能采用较新的版本,因此它不像以前那样忠实地复制原始环境</p>