小编Cha*_*ker的帖子

如何使用在 docker 镜像或新容器中不断变化的 python 库?

我在 python 包中组织我的代码(通常在虚拟环境中virtualenv和/或conda),然后通常调用:

python <path_to/my_project/setup.py> develop
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用我的代码的最新版本。由于我主要开发统计或机器学习算法,因此我会制作大量原型并每天更改代码。但是,最近在我可以访问的集群上运行我们的实验的推荐方法是通过 docker。我了解了 docker,我想我对如何使其工作有一个粗略的想法,但我不太确定我的解决方案是否好或者是否有更好的解决方案。

我认为的第一个解决方案是使用以下解决方案复制我的 docker 映像中的数据:

COPY /path_to/my_project
pip install /path_to/my_project
Run Code Online (Sandbox Code Playgroud)

然后pip安装它。这个解决方案的问题是我每次都必须实际构建一个新图像,这看起来很傻,并希望我能有更好的东西。为此,我想拥有一个 bash 文件,例如:

#BASH FILE TO BUILD AND REBUILD MY STUFF
# build the image with the newest version of 
# my project code and it pip installs it and its depedencies
docker build -t image_name .
docker run --rm image_name python run_ML_experiment_file.py 
docker kill current_container #not sure how to do get id of container
docker rmi image_name
Run Code Online (Sandbox Code Playgroud)

正如我所说,我的直觉告诉我这很愚蠢,所以我希望有一种使用 …

python docker dockerfile

7
推荐指数
1
解决办法
2063
查看次数

是否可以使用SRUN而不是SBATCH在后台运行SLURM作业?

我试图在后台运行带有srun的slurm作业。不幸的是,由于现在我不得不通过docker运行某些东西,因此使用sbatch有点烦人,所以我试图找出是否可以完全避免。

根据我的观察,每当我运行srun时,请说:

srun docker image my_job_script.py
Run Code Online (Sandbox Code Playgroud)

并关闭我正在运行命令的窗口(以避免接收所有打印语句),并打开另一个终端窗口以查看命令是否仍在运行,看来我的运行脚本由于某种原因被取消了。由于它不是通过sbatch进行的,因此不会向我发送带有错误日志的文件(据我所知),所以我不知道为什么它会关闭。

我也尝试过:

srun docker image my_job_script.py &
Run Code Online (Sandbox Code Playgroud)

在终端将控制权还给我。不幸的是,如果我这样做,它仍然会继续在终端屏幕上打印内容,这是我试图避免的。

本质上,我通过ssh登录到远程计算机,然后执行srun命令,但是似乎如果我终止ssh连接的通信,则srun命令会自动终止。有办法阻止这种情况吗?

理想情况下,我基本上希望发送脚本以使其运行,并且不要由于任何原因取消该脚本,除非我将其取消,并且该脚本scancel不应打印到屏幕上。所以我理想的解决方案是:

  1. 即使我退出ssh会话,也要继续运行srun脚本
  2. 即使关闭发送命令的窗口,也要继续运行我的srun脚本
  3. 继续运行我的srun脚本,让我离开srun会话,而不打印到我的屏幕上(即本质上运行到后台)

这将是我的想法解决方案。


对于想了解sbatch问题的好奇人群,我希望能够这样做(这是理想的解决方案):

sbatch docker image my_job_script.py
Run Code Online (Sandbox Code Playgroud)

但是,人们会知道它是行不通的,因为sbatch接收到了不是“ batch”脚本的命令docker。本质上,一个简单的解决方案(实际上不适用于我的情况)是将docker命令包装在批处理脚本中:

#!/usr/bin/sh
docker image my_job_script.py
Run Code Online (Sandbox Code Playgroud)

不幸的是,我实际上是在使用批处理脚本来编码我正在运行的任务的很多信息(类似于配置文件)。因此这样做可能会影响我所做的工作,因为其基础文件正在更改。通过将作业直接发送到sbatch可以避免这种情况,因为它实际上创建了批处理脚本的副本(如本问题所述:在运行期间更改发送给sbatch的bash脚本运行时是一个坏主意吗?)。因此,解决我的问题的真正方法是使批处理脚本包含我的脚本所需的所有信息,然后在python中以某种方式呼叫docker并同时传递所有信息。不幸的是,其中一些信息是函数指针和对象,因此我什至不知道如何将此类信息传递给在python中运行的docker命令。


或者也许能够直接运行docker进行分批处理,而不是使用批处理脚本来解决问题。

python slurm sbatch

7
推荐指数
1
解决办法
2647
查看次数

如果没有自动连接,如何将 Jupyter 内核连接到 VS Code?

我希望能够有一个开箱即用的工作 jupyter 笔记本,用于 VS 代码,而我这边的工作最少。

我尝试打开一个 jupyter 笔记本。我立即找到了解释器并将我的 conda env 与命令颗粒一起使用(command + shift + P然后在下拉菜单中找到了我的 conda env)。这似乎使终端工作,因为哪个 python 指向正确的位置:

(automl-meta-learning) brandomiranda~/automl-meta-learning ? which python
/Users/brandomiranda/miniconda3/envs/automl-meta-learning/bin/python
Run Code Online (Sandbox Code Playgroud)

也从 VS Code 运行 python 脚本似乎也工作正常,请参阅输出:

(automl-meta-learning) brandomiranda~/automl-meta-learning ? /Users/brandomiranda/miniconda3/envs/automl-meta-learning/bin/python /Users/brandomiranda/automl-meta-learning/python_playground.py

x = 1
my_str = this is a string
y = 2
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用 jupyter notebook 时它不起作用。

最明显的是我的 VS 代码没有连接内核,看截图:

在此处输入图片说明

我尝试按照 reddit 上的建议点击几个箭头(vs_code_jupyter_server_no_kernel_python_not):

在此处输入图片说明

当我尝试在我的 jupyter notebook 中运行东西时,我收到以下错误:

Error: Activating Python 3.7.6 64-bit ('base': conda) to run Jupyter failed with Error: StdErr …
Run Code Online (Sandbox Code Playgroud)

python visual-studio conda visual-studio-code jupyter-notebook

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

什么时候应该运行 wandb.watch 以便权重和偏差正确跟踪参数和梯度?

我正在尝试 wandb 库并运行,wandb.watch但这似乎不适用于我的代码。它不应该太复杂,所以我很困惑为什么它不起作用。

代码:

"""
https://docs.wandb.ai/guides/track/advanced/distributed-training

import wandb

# 1. Start a new run
wandb.init(project='playground', entity='brando')

# 2. Save model inputs and hyperparameters
config = wandb.config
config.learning_rate = 0.01

# 3. Log gradients and model parameters
wandb.watch(model)
for batch_idx, (data, target) in enumerate(train_loader):
    ...
    if batch_idx % args.log_interval == 0:
        # 4. Log metrics to visualize performance
        wandb.log({"loss": loss})


Notes:
    - call wandb.init and wandb.log only from the leader process
"""

from argparse import Namespace
from pathlib import …
Run Code Online (Sandbox Code Playgroud)

machine-learning neural-network deep-learning wandb

7
推荐指数
2
解决办法
4834
查看次数

如何使用 PyTorch 的 TorchMeta 创建分布式数据加载器以进行元学习?

我试图用 torchmeta 创建一个 pytorch 分布式数据laoder,但它因死锁而失败:

python ~/ultimate-utils/tutorials_for_myself/my_torchmeta/torchmeta_ddp.py

test_basic_ddp_example

ABOUT TO SPAWN WORKERS (via mp.spawn)
-> started ps with rank=0
-> rank=0
-> mp.current_process()=<SpawnProcess name='SpawnProcess-1' parent=54167 started>
-> os.getpid()=54171
device=device(type='cpu')
----> setting up rank=0 (with world_size=4)
---> MASTER_ADDR='127.0.0.1'
---> 57813
---> backend='gloo'
-> started ps with rank=2
-> rank=2
-> mp.current_process()=<SpawnProcess name='SpawnProcess-3' parent=54167 started>
-> os.getpid()=54173
device=device(type='cpu')
----> setting up rank=2 (with world_size=4)
---> MASTER_ADDR='127.0.0.1'
---> 57813
---> backend='gloo'
-> started ps with rank=1
-> rank=1
-> mp.current_process()=<SpawnProcess name='SpawnProcess-2' parent=54167 started> …
Run Code Online (Sandbox Code Playgroud)

machine-learning deep-learning pytorch meta-learning

7
推荐指数
0
解决办法
834
查看次数

如何在 mac 上调用 strace 的等效命令——最好是从 python 调用?

独立的可重现示例

\n

我需要通过 python 跟踪任何命令的输出。但我只需要将以下 amd linux 命令转换为 mac m1/arm 命令(因此 python 可能不相关):

\n
strace -e trace=execve -v -s 100000000 -xx -ttt -ff -o output.txt sh -c \'echo hi\'\n
Run Code Online (Sandbox Code Playgroud)\n

我怎么做?

\n

这对我来说失败了:

\n
 \xe2\x9d\xaf sudo dtruss -t execve -f sh -c \'echo hi\'\ndtrace: system integrity protection is on, some features will not be available\n\ndtrace: failed to execute sh: Operation not permitted\n
Run Code Online (Sandbox Code Playgroud)\n

笔记:

\n
    \n
  • 我可以完全控制输入,因此我可以在我的 mac 中执行 sudo 和相关命令(主要是为了调试我的代码,因此它可以在 pycharm 上运行)
  • \n
\n
\n

来自brew的strace失败

\n

我似乎无法从brew …

python macos strace systrace apple-m1

7
推荐指数
2
解决办法
7367
查看次数

在go(golang)中将指针传递给字符串有什么意义?

我正在阅读关于go(golang)字符串的以下对话.go中的字符串只是指向(只读)数组和长度的指针.因此,当您将它们传递给函数时,指针将作为值而不是整个字符串传递.因此,我想到,如果这是真的,那么为什么你甚至被允许定义为带有*string作为参数的签名的函数?如果字符串已经加上,则数据是不可变/只读的,因此无论如何都无法更改它.如果已经在内部执行了指针,那么允许将指针传递给字符串有什么意义呢?

string pointers go

6
推荐指数
2
解决办法
6281
查看次数

使具有不可选取字段的对象可选取的正确方法是什么?

对我来说,我所做的就是检测不可选取的内容并将其放入字符串中(我想我也可以将其删除,但随后它会错误地告诉我该字段不存在,但我宁愿让它存在但成为字符串) )。但我想知道是否有一种不那么老套、更正式的方式来做到这一点。

我当前使用的代码:

def make_args_pickable(args: Namespace) -> Namespace:
    """
    Returns a copy of the args namespace but with unpickable objects as strings.

    note: implementation not tested against deep copying.
    ref:
        - /sf/ask/4908983481/
    """
    pickable_args = argparse.Namespace()
    # - go through fields in args, if they are not pickable make it a string else leave as it
    # The vars() function returns the __dict__ attribute of the given object.
    for field in vars(args):
        field_val: Any = getattr(args, field)
        if not dill.pickles(field_val): …
Run Code Online (Sandbox Code Playgroud)

python pickle dill

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

在 PyTorch 中使用分布式数据并行 (DDP) 时,训练期间检查点的正确方法是什么?

我想要(正确且官方的无错误方式)执行以下操作:

\n
    \n
  1. 从检查点恢复以继续在多个 GPU 上进行训练
  2. \n
  3. 在使用多个 GPU 进行训练期间正确保存检查点
  4. \n
\n

为此,我的猜测如下:

\n
    \n
  1. 为了执行第 1 步,我们让所有进程从文件中加载检查点,然后调用DDP(mdl)每个进程。我假设检查点保存了一个ddp_mdl.module.state_dict().
  2. \n
  3. 要做2,只需检查谁的rank = 0并让其执行torch.save({\'model\': ddp_mdl.module.state_dict()})
  4. \n
\n

大概代码:

\n
def save_ckpt(rank, ddp_model, path):\n    if rank == 0:\n        state = {\'model\': ddp_model.module.state_dict(),\n             \'optimizer\': optimizer.state_dict(),\n            }\n        torch.save(state, path)\n\ndef load_ckpt(path, distributed, map_location=map_location=torch.device(\'cpu\')):\n    # loads to\n    checkpoint = torch.load(path, map_location=map_location)\n    model = Net(...)\n    optimizer = ...\n    model.load_state_dict(checkpoint[\'model\'])\n    optimizer.load_state_dict(checkpoint[\'optimizer\'])\n    if distributed:\n        model = DDP(model, device_ids=[gpu], find_unused_parameters=True)\n    return model\n
Run Code Online (Sandbox Code Playgroud)\n

它是否正确?

\n
\n

我问的原因之一是分布式代码可能会出现微妙的错误。我想确保这不会发生在我身上。当然,我想避免死锁,但如果它发生在我身上,那就很明显了(例如,如果所有进程以某种方式尝试同时打开同一个 …

python distributed-computing neural-network deep-learning pytorch

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

训练 PyTorch 脚本直至收敛的标准方法是什么?

检测模型是否收敛的标准方法是什么?我打算记录 5 次损失,每次损失有 95 个置信区间,如果他们都同意,那么我\xe2\x80\x99d 停止脚本。我假设收敛之前的训练必须已经在 PyTorch 或 PyTorch Lightning 中的某个地方实现。我不需要一个完美的解决方案,只需自动执行此操作的标准方法 - 即收敛时停止。

\n

我的解决方案很容易实现。一旦创建了一个标准并将减少更改为none。然后它将输出一个大小为 的张量[B]。每次记录时都会记录下来,并且它是 95 置信区间(如果您愿意,也可以是 std,但这精度要低得多)。然后,每次添加新损失及其置信区间时,请确保其大小保持为 5(或 10),并且 5 个损失彼此之间的 CI 范围在 95 以内。那么如果这是真的就停下来。

\n

您可以使用以下方法计算 CI:

\n
def torch_compute_confidence_interval(data: Tensor,\n                                           confidence: float = 0.95\n                                           ) -> Tensor:\n    """\n    Computes the confidence interval for a given survey of a data set.\n    """\n    n = len(data)\n    mean: Tensor = data.mean()\n    # se: Tensor = scipy.stats.sem(data)  # compute standard error\n    # se, mean: Tensor = …
Run Code Online (Sandbox Code Playgroud)

python machine-learning deep-learning pytorch pytorch-lightning

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