LDM代码学习日记

文章目录

      • [第一步:找到 PyCharm 的主日志文件(idea.log)](#第一步:找到 PyCharm 的主日志文件(idea.log))
      • [第二步:寻找找到 JVM Crash 文件](#第二步:寻找找到 JVM Crash 文件)
      • [第三步: 文件增加虚拟内存](#第三步: 文件增加虚拟内存)
      • [连接 LDM 项目和 conda 中的 ldm 环境](#连接 LDM 项目和 conda 中的 ldm 环境)
        • [确保打开的是 LDM 文件夹](#确保打开的是 LDM 文件夹)
        • [用 Conda 命令补全没有安装的工具包](#用 Conda 命令补全没有安装的工具包)
      • [改为用 pip 命令进行安装](#改为用 pip 命令进行安装)
      • [下载 model 权重文件](#下载 model 权重文件)

第一步:找到 PyCharm 的主日志文件(idea.log)

这是最重要的地方,90% 的崩溃原因(比如插件冲突、内存不足、读取某个文件出错)都会记录在这里。

  1. 按下键盘上的 Win + R 打开"运行"窗口。
  2. 复制并粘贴下面这个路径,然后回车:
c 复制代码
%LOCALAPPDATA%\JetBrains
  1. 这时会弹出一个文件夹,你会看到以 PyCharm 开头的文件夹(比如 PyCharm2023.2 或 PyCharmCE2024.1,后缀取决于你安装的版本)。双击点进最新的那个版本文件夹。
  2. 找到并进入 log 文件夹。
  3. 在里面找到一个名为 idea.log 的文件

第二步:寻找找到 JVM Crash 文件

  1. 按 Win + R 输入 %USERPROFILE%,进入你的用户文件夹(C:\Users\54692)。
  2. 在这个文件夹里,仔细找找有没有名字叫 java_error_in_pycharm_XXXX.log 或者 hs_err_pidXXXX.log 的文件。。

java_error 文件中出现了下面的报错提示

There is insufficient memory for the Java Runtime Environment to continue.

(Java 运行环境没有足够的内存来继续运行。)

The system is out of physical RAM or swap space

(系统已耗尽物理内存(RAM)或虚拟内存(交换空间))

第三步: 文件增加虚拟内存

  • 选择下方的 自定义大小 圆圈选项。
  • 输入要分配的数值(单位是 MB,1GB = 1024MB)。因为你是为了跑 AI 并且之前报了严重的内存不足:
    • 初始大小 (MB):输入 16384 (也就是 16GB)
    • 最大值 (MB):输入 32768 (也就是 32GB,前提是你选的这个盘至少要有 30多G 的空闲空间)

连接 LDM 项目和 conda 中的 ldm 环境

确保打开的是 LDM 文件夹

在下拉菜单中选择 Close Project (关闭项目)。

Open File or Project 界面选择 LDM 文件夹打开

Terminal 中输入解除封印命令

c 复制代码
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

你需要点击 PyCharm 终端窗口右上角(或者左侧边缘)的 ❌ ,把当前这个终端彻底关掉。然后,重新点击底部的 Terminal 打开一个新的终端。命令行前面自动带上了 (base) 或者 (ldm)。

用 Conda 命令补全没有安装的工具包

确保终端的命令行前面带有 (ldm) 的字样(说明环境已激活)。如果没有,手动输入 conda activate ldm 回车。

在里面输入下面这行命令,然后回车:

python 复制代码
python -c "import omegaconf; import pytorch_lightning; import transformers; print('库全都装好啦,完美!')"

如果我们发现弹出了 ModuleNotFoundError,说明确实有工具包没能正确安装。

我们尝试更新 ldm 环境,在 Powershell 中运行下面的代码来更新

python 复制代码
conda env update -f environment.yaml

但是结果发现 opencv-python (计算机视觉图像处理库) 包,其版本 4.1.2.30 版本实在是太古老,导致当前的镜像源无法安装,导致 pip 失败。

假设你之前手动在 ldm 环境里装过一个包叫 package-X,但你的 environment.yaml 里完全没提到 package-X,而且 yaml 里的其他包也不依赖 package-X:

命令 对 package-X 的处理 结果
conda env update -f environment.yaml ❌ 不做处理,保留在环境里 环境里有多余的包,可能造成版本冲突
conda env update -f environment.yaml --prune ✅ 自动删除 package-X 环境严格和 yaml 配置一致,最干净

添加国内清华源频道

python 复制代码
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
  • conda config --add channels:向 conda 的「软件源列表」里添加一个新的下载地址。
  • 每个源的作用:
    • pkgs/main:Anaconda 官方的核心包源(包含 Python、NumPy 等基础工具)。
    • pkgs/r:专门用于 R 语言相关的包。
    • cloud/pytorch:PyTorch 官方的专属源( yaml 里需要的 pytorch=1.11.0、torchvision=0.12.0 都从这里下载)。
    • cloud/conda-forge:社区维护的超大源(包含很多官方源没有的第三方包,比如 mamba)。

清理旧的索引缓存,删除本地可能残留了旧的、过期的索引数据

python 复制代码
conda clean -i
  1. 先切换到 conda 的 base 环境(mamba 必须安装在 base 环境)
python 复制代码
conda activate base
  1. 一键安装 mamba(自动确认,无需手动输 y)
python 复制代码
conda install mamba -n base -c conda-forge -y
  1. 安装完成后,切回你的 ldm 项目环境
python 复制代码
conda activate ldm

改为用 pip 命令进行安装

Conda 在解析依赖关系(Solving environment)时,尤其是当配置了多个镜像源(如清华源)且包含大量包时,默认的求解器(Solver)会计算庞大的依赖树,导致速度极慢甚至卡死。相比之下,pip 通常只处理 Python 包,且依赖解析机制较简单,所以速度会快很多。

environment.yaml 通常包含非 Python 的系统库(由 conda 安装)和 Python 库(由 pip 或 conda 安装)。假设的 environment.yaml 长这样:

yaml 复制代码
name: ldm
channels:
  - pytorch
  - defaults
dependencies:
  - python=3.8.5
  - pip=20.3
  - cudatoolkit=11.3
  - pytorch=1.11.0
  - torchvision=0.12.0
  - numpy=1.19.2
  - pip:
    - albumentations>=0.4.3
    - diffusers
    - opencv-python>=4.1.2.30
    - pudb==2019.2
    - invisible-watermark
    - imageio==2.9.0
    - imageio-ffmpeg==0.4.2
    - pytorch-lightning==1.4.2
    - omegaconf==2.1.1
    - test-tube>=0.7.5
    - streamlit>=0.73.1
    - einops==0.3.0
    - torch-fidelity==0.3.0
    - transformers==4.19.2
    - torchmetrics==0.6.0
    - kornia==0.6
    - -e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers
    - -e git+https://github.com/openai/CLIP.git@main#egg=clip
    - -e .

转换后的 requirements.txt 应该是

python 复制代码
# 基础依赖 (从 Conda 部分转换而来,将单等号 = 替换为双等号 ==,且 pytorch 在 pip 中叫 torch)
torch==1.11.0
torchvision==0.12.0
numpy==1.19.2

# 扩展依赖 (原本就在 pip 列表下的内容,直接平移)
albumentations>=0.4.3
diffusers
opencv-python>=4.1.2.30
pudb==2019.2
invisible-watermark
imageio==2.9.0
imageio-ffmpeg==0.4.2
pytorch-lightning==1.4.2
omegaconf==2.1.1
test-tube>=0.7.5
streamlit>=0.73.1
einops==0.3.0
torch-fidelity==0.3.0
transformers==4.19.2
torchmetrics==0.6.0
kornia==0.6

# 从 GitHub 直接拉取的源码包
-e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers
-e git+https://github.com/openai/CLIP.git@main#egg=clip

# 安装当前目录 (需要确保你运行 pip 命令的目录下有一个 setup.py 文件)
-e .

注意现在的问题是,原版 yaml 文件里包含了 cudatoolkit=11.3,而 pip 是无法像 Conda 那样直接帮你安装底层显卡驱动级的 CUDA Toolkit 的。

下载 model 权重文件

python 复制代码
(ldm) PS E:\LDM> python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms 
Traceback (most recent call last):
  File "scripts/txt2img.py", line 23, in <module>
    from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker
  File "E:\anaconda3\envs\ldm\lib\site-packages\diffusers\__init__.py", line 46, in <module>
    from .pipeline_utils import DiffusionPipeline
  File "E:\anaconda3\envs\ldm\lib\site-packages\diffusers\pipeline_utils.py", line 35, in <module>
    from .dynamic_modules_utils import get_class_from_dynamic_module
  File "E:\anaconda3\envs\ldm\lib\site-packages\diffusers\dynamic_modules_utils.py", line 29, in <module>
    from huggingface_hub import HfFolder, cached_download, hf_hub_download, model_info
ImportError: cannot import name 'cached_download' from 'huggingface_hub' (E:\anaconda3\envs\ldm\lib\site-packages\huggingface_hub\__init__.py)

旧的 diffusers 遇上了全新的 huggingface_hub,发现找不到函数。把 huggingface_hub 也降级到和它们同一个时代的版本。

python 复制代码
pip install huggingface-hub==0.10.1

很糟糕,现在又出现了新的 bug

python 复制代码
(ldm) PS E:\LDM> python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms
Traceback (most recent call last):
  File "E:\anaconda3\envs\ldm\lib\site-packages\transformers\feature_extraction_utils.py", line 403, in get_feature_extractor_dict
    resolved_feature_extractor_file = cached_path(
  File "E:\anaconda3\envs\ldm\lib\site-packages\transformers\utils\hub.py", line 282, in cached_path
    output_path = get_from_cache(
  File "E:\anaconda3\envs\ldm\lib\site-packages\transformers\utils\hub.py", line 585, in get_from_cache
    http_get(url_to_download, temp_file, proxies=proxies, resume_size=resume_size, headers=headers)
  File "E:\anaconda3\envs\ldm\lib\site-packages\transformers\utils\hub.py", line 423, in http_get
    r = requests.get(url, stream=True, proxies=proxies, headers=headers)
  File "E:\anaconda3\envs\ldm\lib\site-packages\requests\api.py", line 73, in get
    return request("get", url, params=params, **kwargs)
  File "E:\anaconda3\envs\ldm\lib\site-packages\requests\api.py", line 59, in request
    return session.request(method=method, url=url, **kwargs)
  File "E:\anaconda3\envs\ldm\lib\site-packages\requests\sessions.py", line 575, in request
    prep = self.prepare_request(req)
  File "E:\anaconda3\envs\ldm\lib\site-packages\requests\sessions.py", line 484, in prepare_request
    p.prepare(
  File "E:\anaconda3\envs\ldm\lib\site-packages\requests\models.py", line 367, in prepare
    self.prepare_url(url, params)
  File "E:\anaconda3\envs\ldm\lib\site-packages\requests\models.py", line 438, in prepare_url
    raise MissingSchema(
requests.exceptions.MissingSchema: Invalid URL '/api/resolve-cache/models/CompVis/stable-diffusion-safety-checker/cb41f3a270d63d454d385fc2e4f571c487c253c5/preprocessor_config.json?%
2FCompVis%2Fstable-diffusion-safety-checker%2Fresolve%2Fmain%2Fpreprocessor_config.json=&etag=%225294955ff7801083f720b34b55d0f1f51313c5c5%22': No scheme supplied. Perhaps you meant 
https:///api/resolve-cache/models/CompVis/stable-diffusion-safety-checker/cb41f3a270d63d454d385fc2e4f571c487c253c5/preprocessor_config.json?%2FCompVis%2Fstable-diffusion-safety-checker%2Fresolve%2Fmain%2Fpreprocessor_config.json=&etag=%225294955ff7801083f720b34b55d0f1f51313c5c5%22?

这是因为 transformers 库是 2022 年的老版本,而 Hugging Face 网站在近几年修改了底层的网址 API(变成了相对路径),导致老代码解析网址失败(Invalid URL)。

注意到是让我们去下载 stable-diffusion-safety-checker(安全检查器 / NSFW 过滤器) 的模型,我们只需要删除安全检查器即可

python 复制代码
# safety_model_id = "CompVis/stable-diffusion-safety-checker"
# safety_feature_extractor = AutoFeatureExtractor.from_pretrained(safety_model_id)
# safety_checker = StableDiffusionSafetyChecker.from_pretrained(safety_model_id)

按 Ctrl + F 搜索 def check_safety,将其修改为

python 复制代码
def check_safety(x_image):
    # 彻底禁用安全检查,直接返回原图
    return x_image, [False] * len(x_image)

再次运行图片生成指令,此时我们的错误只剩下去下载模型对应的 ckpt 权重就能解决

python 复制代码
FileNotFoundError: [Errno 2] No such file or directory: 'models/ldm/stable-diffusion-v1/model.ckpt'

下载网址是 https://hf-mirror.com/CompVis/stable-diffusion-v-1-4-original。 注意到其实会有两个权重文件,两个有细微的差别。我们只需要其中的一个就行

简而言之:sd-v1-4.ckpt 是用于"生成图像(推理)"的精简版文件,而 sd-v1-4-full-ema.ckpt 是用于"继续训练(微调)"的完整版文件。

虽然名字里带不带 "ema" 容易引起误解,但它们的本质区别在于 "文件包含的信息量" 以及 "设计用途"

sd-v1-4.ckpt(通常被称为"非 EMA 模型"或"剪枝版模型 Pruned")

  • 包含内容 :它只包含 用于生成图像的最终权重(实际上,官方在这个文件里提取的往往就是效果最好的 EMA 权重本身),删除了所有用于训练的额外历史数据、优化器状态(Optimizer States)和标准权重。
  • 文件体积:较小(通常在 4GB 左右,如果转换为 fp16 甚至只有 2GB)。
  • 优缺点:加载速度快,极大地节省显存(VRAM)和硬盘空间。
  • 使用场景日常使用(推理 Inference)。如果你只是想用 Stable Diffusion WebUI(比如 AUTOMATIC1111)来输入提示词生成图片,选这个文件就足够了。

sd-v1-4-full-ema.ckpt(Full EMA 模型 / 完整版)

  • 包含内容 :它是一个 "完整的训练快照"。里面不仅包含了用于生成的 EMA 权重,还保留了"标准权重"、EMA 更新的历史动量(Momentum),以及优化器(如 Adam)的完整状态。
  • 文件体积:非常大(通常在 7GB 以上)。
  • 优缺点:占用大量硬盘和内存,但保留了模型在训练中断那一刻的完整记忆。
  • 使用场景模型训练与微调(Training & Fine-tuning)。如果你是一名开发者,想要基于 v1.4 的基础继续进行大规模的深度训练(比如全参数微调),你需要加载这个文件。如果不使用 full-ema 模型直接续训,模型可能会因为失去了 EMA 动量和优化器状态而出现"灾难性遗忘"或训练初期的剧烈震荡。
相关推荐
凌盛羽2 小时前
使用python绘图分析电池充电曲线
开发语言·python·stm32·单片机·fpga开发·51单片机
wenroudelang88882 小时前
Visual Studio的C#实例--2个窗体之间跳转
ide·c#·visual studio
互联网时光机2 小时前
TikToken 使用教程:从原理到实战,一文搞懂 OpenAI 的文本分词利器
人工智能·python
zzwq.3 小时前
Anaconda创建虚拟环境以及与pycharm关联
python·pycharm
ZTLJQ3 小时前
数据的另一面:Python中NoSQL数据库完全解析
开发语言·python·nosql
XiYang-DING3 小时前
【Java SE】泛型(Generics)
java·windows·python
Predestination王瀞潞3 小时前
Base Tools-Associate-Second:CSV库详解
python·csv
紫丁香3 小时前
03-Flask请求上下文响应与错误处理机制深度解析
后端·python·flask
云霄IT3 小时前
安卓apk逆向之crc32检测打补丁包crc32_patcher.py
java·前端·python