我在 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)
正如我所说,我的直觉告诉我这很愚蠢,所以我希望有一种使用 …
我试图在后台运行带有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不应打印到屏幕上。所以我理想的解决方案是:
这将是我的想法解决方案。
对于想了解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进行分批处理,而不是使用批处理脚本来解决问题。
我希望能够有一个开箱即用的工作 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
我正在尝试 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) 我试图用 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) 我需要通过 python 跟踪任何命令的输出。但我只需要将以下 amd linux 命令转换为 mac m1/arm 命令(因此 python 可能不相关):
\nstrace -e trace=execve -v -s 100000000 -xx -ttt -ff -o output.txt sh -c \'echo hi\'\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n笔记:
\n我似乎无法从brew …
我正在阅读关于go(golang)字符串的以下对话.go中的字符串只是指向(只读)数组和长度的指针.因此,当您将它们传递给函数时,指针将作为值而不是整个字符串传递.因此,我想到,如果这是真的,那么为什么你甚至被允许定义为带有*string作为参数的签名的函数?如果字符串已经加上,则数据是不可变/只读的,因此无论如何都无法更改它.如果已经在内部执行了指针,那么允许将指针传递给字符串有什么意义呢?
对我来说,我所做的就是检测不可选取的内容并将其放入字符串中(我想我也可以将其删除,但随后它会错误地告诉我该字段不存在,但我宁愿让它存在但成为字符串) )。但我想知道是否有一种不那么老套、更正式的方式来做到这一点。
我当前使用的代码:
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) 我想要(正确且官方的无错误方式)执行以下操作:
\n为此,我的猜测如下:
\nDDP(mdl)每个进程。我假设检查点保存了一个ddp_mdl.module.state_dict().大概代码:
\ndef 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\nRun Code Online (Sandbox Code Playgroud)\n它是否正确?
\n我问的原因之一是分布式代码可能会出现微妙的错误。我想确保这不会发生在我身上。当然,我想避免死锁,但如果它发生在我身上,那就很明显了(例如,如果所有进程以某种方式尝试同时打开同一个 …
python distributed-computing neural-network deep-learning pytorch
检测模型是否收敛的标准方法是什么?我打算记录 5 次损失,每次损失有 95 个置信区间,如果他们都同意,那么我\xe2\x80\x99d 停止脚本。我假设收敛之前的训练必须已经在 PyTorch 或 PyTorch Lightning 中的某个地方实现。我不需要一个完美的解决方案,只需自动执行此操作的标准方法 - 即收敛时停止。
\n我的解决方案很容易实现。一旦创建了一个标准并将减少更改为none。然后它将输出一个大小为 的张量[B]。每次记录时都会记录下来,并且它是 95 置信区间(如果您愿意,也可以是 std,但这精度要低得多)。然后,每次添加新损失及其置信区间时,请确保其大小保持为 5(或 10),并且 5 个损失彼此之间的 CI 范围在 95 以内。那么如果这是真的就停下来。
您可以使用以下方法计算 CI:
\ndef 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