MachineLearning

2023-04-06

stable-baselines3

强化学习训练日志指标和参数解释

-----------------------------------------
| rollout/                |             |
|    ep_len_mean          | 2.24e+03    |
|    ep_rew_mean          | 1.38e+03    |
| time/                   |             |
|    fps                  | 185         |
|    iterations           | 298         |
|    time_elapsed         | 3295        |
|    total_timesteps      | 610304      |
| train/                  |             |
|    approx_kl            | 0.024709977 |
|    clip_fraction        | 0.11        |
|    clip_range           | 0.2         |
|    entropy_loss         | -0.26       |
|    explained_variance   | 0.936       |
|    learning_rate        | 0.0003      |
|    loss                 | 0.425       |
|    n_updates            | 2970        |
|    policy_gradient_loss | -0.016      |
|    value_loss           | 4.92        |
-----------------------------------------
  • rollout/ep_len_mean:这是每个回合(episode)的平均长度,即每个回合中执行的平均步数(step)。回合是强化学习中的一个基本概念,指的是智能体(agent)从初始状态开始,与环境(environment)交互,直到达到终止状态的过程。回合长度越长,说明智能体能够在环境中存活越久。
  • rollout/ep_rew_mean:这是每个回合的平均奖励(reward),即每个回合中获得的平均累积奖励。奖励是强化学习中的另一个基本概念,指的是环境对智能体行为的反馈,用来评价行为的好坏。奖励越高,说明智能体表现越好。

  • time/fps:这是训练过程中的帧率(frames per second),即每秒钟处理的步数。帧率越高,说明训练速度越快。
  • time/iterations:这是训练过程中的迭代次数(iterations),即更新策略(policy)的次数。迭代次数越多,说明训练越充分。
  • time/time_elapsed:这是训练过程中消耗的时间(time elapsed),以秒为单位。时间越短,说明训练效率越高。
  • time/total_timesteps:这是训练过程中总共执行的步数(total timesteps),即智能体与环境交互的总次数。步数越多,说明训练数据越多。

  • train/approx_kl:这是训练过程中近似的KL散度(approximate Kullback-Leibler divergence),即新旧策略之间的差异程度。KL散度是一种衡量两个概率分布相似性的指标,越小说明越相似。在某些强化学习算法中,KL散度可以用来控制策略更新的步长,避免更新过大导致不稳定。
  • train/clip_fraction:这是训练过程中被裁剪(clipped)的梯度比例(gradient ratio)。在某些强化学习算法中,为了防止策略更新过大,会对梯度进行裁剪,即限制梯度在一个范围内。裁剪比例越高,说明更新幅度越大。
  • train/clip_range:这是训练过程中梯度裁剪的范围(gradient clipping range)。它是一个超参数(hyperparameter),可以根据实验效果进行调整。
  • train/entropy_loss:这是训练过程中的熵损失(entropy loss),即策略熵(policy entropy)的相反数。熵是一种衡量不确定性的指标,越高说明越不确定。在某些强化学习算法中,为了增加策略的探索性(exploration),会给目标函数加上一个熵项,使得策略更倾向于选择不确定性高的行为。熵损失越低,说明策略更多样化。
  • train/explained_variance:这是训练过程中的可解释方差(explained variance),即价值函数(value function)对回报(return)的预测准确度。可解释方差是一种衡量回归模型拟合效果的指标,越接近1说明越准确。
  • train/learning_rate:这是训练过程中的学习率(learning rate),即梯度下降法中更新参数的速率。它也是一个超参数,可以根据实验效果进行调整。
  • train/loss:这是训练过程中的总损失(total loss),即目标函数(objective function)的值。损失越小,说明模型性能越好。
  • train/n_updates:这是训练过程中的更新次数(update times),即更新参数的次数。更新次数越多,说明训练越充分。
  • train/policy_gradient_loss:这是训练过程中的策略梯度损失(policy gradient loss),即基于策略梯度法优化策略时产生的损失。策略梯度法是一种强化学习算法,它通过直接优化策略来提高期望奖励。策略梯度损失越小,说明策略性能越好。
  • train/value_loss:这是训练过程中的价值损失(value loss),即基于最小二乘法优化价值函数时产生的损失。价值函数是一种估计未来回报的函数,在某些强化学习算法中,它可以辅助策略优化或者直接作为输出。价值损失越小,说明价值函数越准确。

stable-diffusion

webui

命令仓库:

https://github.com/camenduru/stable-diffusion-webui-colab

启动命令:

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Command-Line-Arguments-and-Settings

--share --listen --enable-insecure-extension-access

扩展

汉化扩展:https://github.com/hanamizuki-ai/stable-diffusion-webui-localization-zh_Hans

图库浏览器扩展:https://github.com/AlUlkesh/stable-diffusion-webui-images-browser

提示词自动补全扩展:https://github.com/DominikDoom/a1111-sd-webui-tagcomplete.git -> 汉化提示词(复制到extensions\a1111-sd-webui-tagcomplete\tags目录):http://www.123114514.xyz/d/WebUI/Tag/a1111-sd-webui-tagcomplete.zip

反推提示词(tagg):https://github.com/toriato/stable-diffusion-webui-wd14-tagger -> 要重启命令才生效

controlnet: https://github.com/Mikubill/sd-webui-controlnet -> 模型文件(复制到models\ControlNet目录):https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main

3D Openpose Editor: https://github.com/nonnonstop/sd-webui-3d-open-pose-editor (在线直接使用)

神经网络模型可视化

在tensorboard里可视化 StableBaselines3 的模型网络结构

Stable-Baselines3 默认支持 TensorBoard,但它不直接支持在 TensorBoard 中可视化模型网络结构。要在 TensorBoard 中可视化模型网络结构,可以使用 PyTorch 的 SummaryWriter 类。以下是一个示例:

首先,确保安装了所需的库:

pip install stable-baselines3 tensorboard

然后,你可以使用以下代码在 TensorBoard 中可视化模型网络结构:

import os
import torch
from torch.utils.tensorboard import SummaryWriter
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv
from stable_baselines3.common.env_util import make_atari_env

# 创建 Atari 游戏环境
env_id = "BreakoutNoFrameskip-v4"
env = make_atari_env(env_id, n_envs=1, seed=0)
env = DummyVecEnv([lambda: env])

# 使用 PPO 算法训练模型
model = PPO("CnnPolicy", env, verbose=1)

# 获取模型的神经网络
policy_net = model.policy.to("cpu")

# 为可视化创建一个虚拟输入
dummy_input = torch.randn(1, *env.observation_space.shape)

# 设置 TensorBoard 日志目录
log_dir = "tensorboard_logs"
os.makedirs(log_dir, exist_ok=True)

# 使用 PyTorch 的 SummaryWriter 将模型网络结构写入 TensorBoard
writer = SummaryWriter(log_dir)
writer.add_graph(policy_net, dummy_input)
writer.close()

这段代码首先创建一个 Atari 游戏环境,然后使用 PPO 算法训练模型。接下来,它获取模型的神经网络并将其转换为 CPU 设备。然后,它创建一个虚拟输入。接下来,它设置 TensorBoard 日志目录并使用 PyTorch 的 SummaryWriter 将模型网络结构写入 TensorBoard。

要查看 TensorBoard 中的模型网络结构,请在命令行中运行以下命令:

tensorboard --logdir tensorboard_logs

然后,在浏览器中打开显示的 URL(通常为 http://localhost:6006),并导航到 “Graphs” 标签以查看模型网络结构。

请注意,这个示例使用了 PPO 算法和 Atari 游戏环境。你可以根据需要替换为其他算法和环境。

PyTorch 自带的可视化工具 torchviz

Windows下安装

首先pip安装:

pip install graphviz
pip install torchviz

然后安装 GraphViz 工具:

下载地址:https://graphviz.org/download/

建议用exe文件安装,安装时勾选添加graphviz路径到系统PATH环境变量中。

如果是在 git-bash 环境下,安装完成后环境变量不会自动导入,需要手动指定 或者 重启电脑即可。

安装完成后,可以在命令行终端输入dot -version验证是否已成功安装Graphviz。如果成功安装,会输出Graphviz的版本信息。

使用案例:

...
outputs = self.model(X_train)
if self.args.show_model:
    # 可视化模型结构
    from torchviz import make_dot
    make_dot(outputs, params=dict(self.model.named_parameters())).view()
    exit()
...

Windows 安装CUDA

从NVIDIA官网下载CUDA的安装包

CUDA Toolkit下载地址: https://developer.nvidia.com/cuda-downloads

Windows 下 pytoch CUDA安装

从pytorch官网下载对应CUDA版本: https://pytorch.org/get-started/locally/

WSL2安装CUDA

安装好WSL2前提下执行

1.在Windows下安装显卡驱动

CUDA on WSL 驱动下载地址:https://developer.nvidia.com/cuda/wsl

2.WSL2中安装CUDA

CUDA工具箱下载地址: https://developer.nvidia.com/cuda-downloads

可以使用以下命令来验证CUDA是否已经安装:

nvcc --version

如果输出类似于以下内容,则表示CUDA已成功安装:

nvcc: NVIDIA (R) Cuda compiler driver

nvcc命令not found

查看cuda的bin目录下是否有nvcc

ls -alh /usr/local/cuda/bin

如果存在,直接将cuda路径加入系统路径即可:

vim ~/.bashrc进入配置文件,添加以下两行:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

WSL2下Ubuntu的Docker中使用CUDA

基本的Docker镜像托管在 https://hub.docker.com/r/nvidia/cuda

原始项目位于 https://gitlab.com/nvidia/container-images/cuda

1.Nvidia Container Toolkit安装

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

确保拿到源信息:cat /etc/apt/sources.list.d/nvidia-docker.list

deb https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/$(ARCH) /
#deb https://nvidia.github.io/libnvidia-container/experimental/ubuntu18.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-container-runtime/stable/ubuntu18.04/$(ARCH) /
#deb https://nvidia.github.io/nvidia-container-runtime/experimental/ubuntu18.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-docker/ubuntu18.04/$(ARCH) /

安装 nvidia-container-toolkit 软件包 (或者安装 nvidia-docker2 试试 https://github.com/NVIDIA/nvidia-docker):

apt-get install nvidia-container-toolkit

验证是否正确安装了 nvidia-container-toolkit。您可以使用以下命令检查版本号:

dpkg -l | grep nvidia-container-toolkit

确保 nvidia-container-runtime 文件被创建

# ls -alh /usr/bin/nvidia-container-runtime
-rwxr-xr-x 1 root root 3.0M Apr 24 20:26 /usr/bin/nvidia-container-runtime*

2.配置NVIDIA容器运行时

使用命令:

nvidia-ctk runtime configure

加载(或创建)一个/etc/docker/daemon.json文件,并确保NVIDIA容器运行时被配置为名为nvidia的运行时。

cat /etc/docker/daemon.json

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}

3.重启docker

ps -ef | grep dockerd

kill <dockerd pid>

nohup sh -c "dockerd &"

验证docker使用了nvidia容器运行时:

docker info|grep nvidia

或使用容器跑nvidia-smi命令

docker run -it --gpus=all --rm nvidia/cuda:11.4.2-base-ubuntu20.04 nvidia-smi