当前位置: 首页 > news >正文

完整的 LoRA 模型训练步骤:如何使用 Kohya_ss 进行 LoRA 训练

完整的 LoRA 模型训练步骤:如何使用 Kohya_ss 进行 LoRA 训练

  • 一、环境配置
    • 1. 安装 Python 和虚拟环境
    • 2. 克隆 Kohya_ss 仓库
    • 3. 安装依赖
    • 4. 启动 GUI
  • lora训练
    • 1. 准备数据 图片处理打标签
    • 2. 配置 LoRA 训练
    • 2.2 配置图片文件夹和输出目录
  • 训练
    • 解决方法:

使用kohya_ss来进行lora训练,难点就是各种报错的问题

如果你自己的CUDA,python,pytorch版本还和官网推荐的不一样,更是报错更多,

Kohya_ss 是一个功能强大的工具,专为 Stable Diffusion 模型的训练设计,可以帮助用户使用 LoRA 方法对模型进行微调。在本文中,我们将详细介绍如何使用 Kohya_ss 进行 LoRA 模型训练的完整步骤,包括环境配置、数据处理、以及模型训练等。

我是Linux centOS系列,用的英伟达CUDA11.2的服务器,虽然官方使用至少是CUDA11.8,但从底层的算子逻辑原理上CUDA11.2是兼容的。

具体步骤如下:

一、环境配置

1. 安装 Python 和虚拟环境

首先,你需要在 CentOS 系统上创建一个 Python 虚拟环境。以下是详细步骤:

安装 Conda: 如果你没有安装 Anaconda 或 Miniconda,可以从官方网站下载并安装它们。
创建 Python 3.10.9 环境: 安装完成后,使用以下命令创建一个 Python 3.10.9 的虚拟环境:

conda create --name kohya_ss python=3.10.9

注意必须是3.10.9,不然后续安装一些库的时候,不兼容报错

激活环境:

conda activate <your_env_name>

2. 克隆 Kohya_ss 仓库

Kohya_ss 项目托管在 GitHub 上,你可以使用以下命令克隆仓库:

git clone --recursive https://github.com/bmaltais/kohya_ss.git
cd kohya_ss

3. 安装依赖

在 kohya_ss 目录下,运行以下命令安装必要的依赖:

chmod +x ./setup.sh
./setup.sh

如果安装这里,报错,或者没有权限去安装,也可以打开项目的requirements_linux.txtrequirements.txt的文件,手动pip安装。

我的CUDA是11.2 兼容的torch版本正好就是文件里requirements_linux.txt的:

pip install torch==2.1.2+cu118 torchvision==0.16.2+cu118 xformers==0.0.23.post1+cu118 --extra-index-url https://download.pytorch.org/whl/cu118

最后安装完所有通过python -m bitsandbytes验证,如果没有报错就说明安装没问题了。

python -m bitsandbytes

4. 启动 GUI

若要在 Linux 上启动 GUI,你可以使用以下命令:

bash gui.sh --listen 0.0.0.0 --server_port 7860 --inbrowser --share

这里 0.0.0.0 表示可以从任何 IP 地址访问服务器,7860 是端口号,–share 参数允许你共享链接。你可以根据需要调整这些参数。

后续在训练的时间,需要通过网络访问huggingface下载预训练模型,但通常linux服务器没有代理,是无法访问的,下载不了模型,或者在下载模型时出现连接超时的问题

我的方法是

HF_ENDPOINT=https://hf-mirror.com bash gui.sh --listen 0.0.0.0 --server_port 7860 --inbrowser --share

利用一个镜像地址: http://hf-mirror.com下载

lora训练

1. 准备数据 图片处理打标签

首先,你需要准备原始训练图片,并使用 Kohya_ss 中的 BLIP Captioning 工具对这些图片进行描述。

在 Kohya_ss 的 GUI 中,点击 Utilities,然后选择 CaptioningBLIP Captioning
在这里插入图片描述
在弹出的界面中,选择存储训练图片的文件夹,

并在 “Prefix to add to BLIP caption” 栏目中填写图片描述的前缀文字(可选)(不填的话,后续点Caption images,生成标签过程也会下载预训练的blip模型,给你图像描述的)。

点击 Caption images 按钮开始对图片进行处理。

此时,BLIP 将生成每张图片的文字描述,这些描述将用于训练LoRA 模型。

linux日志出现如下,就说明生成出来了
在这里插入图片描述

为什么打标签:标签为模型学习提供明确的目标和方向。在 LoRA 训练中,模型通过对数据集中图像和对应标签的学习,理解不同数据特征与期望输出之间的关系。例如在训练一个生成动漫角色的 LoRA 模型时,标签可以是角色的名字、性格特点、所属动漫等信息。模型在训练过程中,依据这些标签,将图像中的人物外貌、服饰风格等特征与标签内容建立联系,从而学习到如何生成符合特定角色设定的图像。如果没有标签,模型就无法得知这些图像代表的具体概念,难以进行针对性学习。

2. 配置 LoRA 训练

在 Configuration file 部分,你可以选择加载一个预定义的配置文件。可以在网上找到一些常用的配置文件,或者根据你的需求自行编写。这个文件通常是一个 JSON 格式的文件,包含了训练过程的参数和设置,其实也不需要自己准备,在你lora,gui界面训练的时候,就会自动生成,可以直接跳过这里

例如,配置文件可能看起来像这样:

{"LoRA_type": "Standard","LyCORIS_preset": "full","adaptive_noise_scale": 0,"additional_parameters": "","async_upload": false,"block_alphas": "","block_dims": "","block_lr_zero_threshold": "","bucket_no_upscale": true,"bucket_reso_steps": 64,"bypass_mode": false,"cache_latents": true,"cache_latents_to_disk": false,"caption_dropout_every_n_epochs": 0,"caption_dropout_rate": 0,"caption_extension": ".txt","clip_skip": 1,"color_aug": false,"constrain": 0,"conv_alpha": 1,"conv_block_alphas": "","conv_block_dims": "","conv_dim": 1,"dataset_config": "","debiased_estimation_loss": false,"decompose_both": false,"dim_from_weights": false,"dora_wd": false,"down_lr_weight": "","dynamo_backend": "no","dynamo_mode": "default","dynamo_use_dynamic": false,"dynamo_use_fullgraph": false,"enable_bucket": true,"epoch": 1,"extra_accelerate_launch_args": "","factor": -1,"flip_aug": false,"fp8_base": false,"full_bf16": false,"full_fp16": false,"gpu_ids": "","gradient_accumulation_steps": 1,"gradient_checkpointing": false,"huber_c": 0.1,"huber_schedule": "snr","huggingface_path_in_repo": "","huggingface_repo_id": "","huggingface_repo_type": "","huggingface_repo_visibility": "","huggingface_token": "","ip_noise_gamma": 0,"ip_noise_gamma_random_strength": false,"keep_tokens": 0,"learning_rate": 0.0001,"log_tracker_config": "","log_tracker_name": "","log_with": "","logging_dir": "/data/kohya_ss/logs","loss_type": "l2","lr_scheduler": "cosine","lr_scheduler_args": "","lr_scheduler_num_cycles": 1,"lr_scheduler_power": 1,"lr_warmup": 10,"main_process_port": 0,"masked_loss": false,"max_bucket_reso": 2048,"max_data_loader_n_workers": 0,"max_grad_norm": 1,"max_resolution": "512,512","max_timestep": 1000,"max_token_length": 75,"max_train_epochs": 0,"max_train_steps": 1600,"mem_eff_attn": false,"metadata_author": "","metadata_description": "","metadata_license": "","metadata_tags": "","metadata_title": "","mid_lr_weight": "","min_bucket_reso": 256,"min_snr_gamma": 0,"min_timestep": 0,"mixed_precision": "fp16","model_list": "","module_dropout": 0,"multi_gpu": false,"multires_noise_discount": 0.3,"multires_noise_iterations": 0,"network_alpha": 1,"network_dim": 8,"network_dropout": 0,"network_weights": "","noise_offset": 0,"noise_offset_random_strength": false,"noise_offset_type": "Original","num_cpu_threads_per_process": 2,"num_machines": 1,"num_processes": 1,"optimizer": "AdamW8bit","optimizer_args": "","output_dir": "/data/kohya_ss/outputs","output_name": "tianqiong1","persistent_data_loader_workers": false,"pretrained_model_name_or_path": "runwayml/stable-diffusion-v1-5","prior_loss_weight": 1,"random_crop": false,"rank_dropout": 0,"rank_dropout_scale": false,"reg_data_dir": "","rescaled": false,"resume": "","resume_from_huggingface": "","sample_every_n_epochs": 0,"sample_every_n_steps": 0,"sample_prompts": "","sample_sampler": "euler_a","save_every_n_epochs": 1,"save_every_n_steps": 0,"save_last_n_steps": 0,"save_last_n_steps_state": 0,"save_model_as": "safetensors","save_precision": "fp16","save_state": false,"save_state_on_train_end": false,"save_state_to_huggingface": false,"scale_v_pred_loss_like_noise_pred": false,"scale_weight_norms": 0,"sdxl": false,"sdxl_cache_text_encoder_outputs": false,"sdxl_no_half_vae": false,"seed": 0,"shuffle_caption": false,"stop_text_encoder_training_pct": 0,"text_encoder_lr": 0.0001,"train_batch_size": 1,"train_data_dir": "/data/kohya_ss/dataset","train_norm": false,"train_on_input": true,"training_comment": "","unet_lr": 0.0001,"unit": 1,"up_lr_weight": "","use_cp": false,"use_scalar": false,"use_tucker": false,"v2": false,"v_parameterization": false,"v_pred_like_loss": 0,"vae": "","vae_batch_size": 0,"wandb_api_key": "","wandb_run_name": "","weighted_captions": false,"xformers": "xformers"
}

2.2 配置图片文件夹和输出目录

在 Kohya_ss 的 GUI 中,点击 loRA,然后选择 Training

在这里插入图片描述

在 Image folder 选项中选择你存储训练图片的文件夹。在 Output folder 中选择你希望保存训练结果(LoRA 文件)的目录。

放图片的文件夹用数字_英文的格式,比如100_abc这样的名字来命名,100代表重复图像100次,如果你要训练500次,就改成500_abc。jpg和txt都放在一起。为什么要这么取名字,因为这是kohya_ss软件作者定的规矩

文件夹必须放在kohya_ss/dataset下面
在这里插入图片描述
后面详细的参数配置里有EpochMax train step
在这里插入图片描述

Train batch size (训练批量大小)

这个参数指定了每次训练时输入到模型中的样本数量。它决定了每一轮(batch)计算的训练数据量。大批量训练能够利用GPU的并行计算能力,但也会消耗更多的内存。较小的批量大小则会减少内存占用,但可能会导致训练速度变慢。

举例来说:
如果设置为 batch size = 64,每次训练时会使用64张图片进行 前向传播和反向传播。
如果内存较小,可能需要降低批量大小以避免内存溢出。

Max train epoch (最大训练周期数)

训练周期数(epoch)指的是整个训练数据集被模型完整使用的次数。一个 epoch 代表训练集中的所有图像都被用来训练了一次。如果这个参数设置为 1,那么模型只会遍历一次训练数据集。

如果设置为 Max train epoch = 1,表示在训练过程中,数据集将只被使用一次。如果你希望模型多次遍历数据集以进行优化,可以增加这个值。

Max train steps (最大训练步数)

训练步数指的是模型参数更新的次数。每个训练步骤对应于一批数据的处理和权重更新。如果设置了 Max train steps,训练将会在达到指定的步数后停止。

如果设置为 Max train steps = 1600,意味着模型将在达到1600步之后停止训练,尽管最大训练周期数可能允许更多的遍历。

注意:如果你同时设置了 Max train epoch 和 Max train steps,训练将会根据更先达到的条件停止。即,如果训练步骤达到了最大步数,训练会提前停止。

还记得之前的文件夹命名吗,10_abc就等于,把文件夹里所有的图片乘以100下,也就是有1000张图片,下面用一段案列分析

假设你有 1000 张图像,epoch 设置为 50,batch_size 为 1,以下是一些相关参数的影响和内存占用的计算。

  1. 内存占用分析

内存占用主要取决于以下几个因素:

  • 每张图像的大小(例如,尺寸、颜色通道等)
  • 批量大小(batch_size)
  • 图像数量(num_train_images)
  • 模型本身的内存占用

但在此情况下,我们主要关注每次训练时的图像数据占用。

假设:

每张图像的尺寸:假设每张图像大小为 256 x 256 x 3(RGB图像)。
图像数据存储:每个像素点使用 4 字节(float32),即 32 位。
每张图像的内存占用:

在这里插入图片描述

  1. 每次训练的内存占用

由于 batch_size = 1,每个批次会加载一张图像到内存中,因此每次训练所需的内存大小就是每张图像的大小。对于每个批次:

在这里插入图片描述

  1. 总训练内存占用

每个 epoch 会遍历所有训练图像一次。在你的配置中,epoch = 50,每个 epoch 会训练 1000 张图像。所以:

在这里插入图片描述

每次训练时,每个批次都要将当前的图像加载到 GPU 内存中,因此每个 epoch 的内存占用大约为 750 MiB。所有训练的时候要考虑一下文件夹命名需要重复几次,还有图像的分辨率如果太高了,很可能导致GPU内存不足

训练

点击start training
在这里插入图片描述
可能会出现报错
在这里插入图片描述

解决方法:

在 CentOS 上设置虚拟显示器(Xvfb)的方法与 Ubuntu 类似。以下是为 CentOS 配置 Xvfb 和运行 GUI 程序的详细步骤:

  1. 安装 Xvfb

首先,安装 Xvfb 包:
我是centOS用的yuml,如果是Ubuntu用lapt-getl

yum install xorg-x11-server-Xvfb
  1. 启动 Xvfb

启动 Xvfb 服务器并指定显示编号(通常使用 :99):

Xvfb :99 &

这个命令将启动一个虚拟显示器,并且在后台运行。

  1. 设置 DISPLAY 环境变量

然后,设置 DISPLAY 环境变量,让系统知道应该使用虚拟显示器:

export DISPLAY=:99

这一步非常重要,必须指向 Xvfb 模拟的显示器。你可以将这行代码添加到 .bashrc 或 .bash_profile 文件中,以便在每次登录时自动设置。

验证模型:训练好了,找到文件模型,可以在stable diffusion weui或者comfyui上验证,我用的comfyui,我先找到一张原图,通过反向推理提示词,生成提示词文本,导入到clip进行生成

相关文章:

完整的 LoRA 模型训练步骤:如何使用 Kohya_ss 进行 LoRA 训练

完整的 LoRA 模型训练步骤&#xff1a;如何使用 Kohya_ss 进行 LoRA 训练 一、环境配置1. 安装 Python 和虚拟环境2. 克隆 Kohya_ss 仓库3. 安装依赖4. 启动 GUI lora训练1. 准备数据 图片处理打标签2. 配置 LoRA 训练2.2 配置图片文件夹和输出目录 训练解决方法&#xff1a; 使…...

视觉分析之边缘检测算法

9.1 Roberts算子 Roberts算子又称为交叉微分算法&#xff0c;是基于交叉差分的梯度算法&#xff0c;通过局部差分计算检测边缘线条。 常用来处理具有陡峭的低噪声图像&#xff0c;当图像边缘接近于正45度或负45度时&#xff0c;该算法处理效果更理想。 其缺点是对边缘的定位…...

git输错用户名或者密码

git push时候跳出window弹窗&#xff0c;输入用户名和密码&#xff0c;如果错误&#xff0c;会有如下情况&#xff1a; $ git push -u origin “master” remote: [session-6c466aa6] rain: Incorrect username or password (access token) fatal: Authentication failed for ‘…...

【Unity Shader编程】之图元装配与光栅化

执行方式&#xff1a;自动完成 图元装配自动化流程 顶点坐标存入装配区 → 按绘制模式连接顶点 → 生成完整几何图元 示例&#xff1a;gl.drawArrays(gl.TRIANGLES, 0, 3)自动生成三角形 会自动自动裁剪超出屏幕范围&#xff08;NDC空间外&#xff09;的三角形&#xff0c;仅保…...

以ChatGPT为例解析大模型背后的技术

目录 1、大模型分类 2、为什么自然语言处理可计算&#xff1f; 2.1、One-hot分类编码&#xff08;传统词表示方法&#xff09; 2.2、词向量 3、Transformer架构 3.1、何为注意力机制&#xff1f; 3.2、注意力机制在 Transformer 模型中有何意义&#xff1f; 3.3、位置编…...

网页版的俄罗斯方块

1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…...

Linux运维_Dockerfile_打包Moby-26.1.4编译dockerd环境

Linux运维_Dockerfile_打包Moby-26.1.4编译dockerd环境 Dockerfile 是一个文本文件, 包含了构建 Docker 镜像的所有指令。 Dockerfile 是一个用来构建镜像的文本文件, 文本内容包含了一条条构建镜像所需的指令和说明。 通过定义一系列命令和参数, Dockerfile 指导 Docker 构…...

数据中心储能蓄电池状态监测管理系统 组成架构介绍

安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高&#xff0c;蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性&#xff0c;分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…...

layui.table.exportFile 导出数据并清除单元格中的空格

Layui在执行数据导出的时候&#xff0c;会出现部分数据单元格中有空格的情况,下面的方法可以去除掉单元格中的空格,供大家参考&#xff01;&#xff01; function table_export(id,title) {//根据传入tableID获取表头var headers $("div[lay-id" id "] .layu…...

vue-指令

前端开发Vue的指令 Vue.js 提供了丰富的指令系统&#xff0c;用于扩展HTML的功能和行为。这些指令可以分为内置指令和自定义指令两大类。以下是对Vue.js中常见指令的详细解释和示例&#xff1a; 1. 内置指令 1.1 插值表达式 用法&#xff1a;{{ expression }}示例&#xff…...

跟着李沐老师学习深度学习(十三)

现代循环神经网络 循环神经网络中梯度异常在实践中的意义引发了一些问题&#xff1a; 早期观测值影响重大&#xff1a;早期观测值对预测所有未来观测值极为重要&#xff0c;如序列中第一个观测值包含校验和&#xff0c;需在序列末尾辨别其是否正确&#xff0c;若无特殊机制存…...

鸿蒙与跨端迁移的重要性

鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是由华为公司开发的一款面向未来的全场景分布式操作系统。它旨在提供一个统一的平台&#xff0c;支持各种设备之间的无缝协作和数据共享&#xff0c;从而为用户提供更加连贯和高效的体验。在鸿蒙的生态系统中&#xff0c;跨端迁移…...

成员函数定义后面加const是什么功能:C++中const成员函数的作用

成员函数定义后面加const是什么功能&#xff1a;C中const成员函数的作用 前言C中const成员函数的作用总结 前言 在PX4的代码中的位置控制模块中&#xff0c;有这样一个成员函数 void getAttitudeSetpoint(vehicle_attitude_setpoint_s &attitude_setpoint) const;该函数的…...

QSNCTF-WEB做题记录

第一题&#xff0c;文章管理系统 来自 <天狩CTF竞赛平台> 描述&#xff1a;这是我们的文章管理系统&#xff0c;快来看看有什么漏洞可以拿到FLAG吧&#xff1f;注意&#xff1a;可能有个假FLAG哦 1&#xff0c;首先观察题目网站的结构和特征 这个一个文件管理系统&#x…...

UE引擎游戏加固方案解析

据VGinsights的报告&#xff0c;近年来UE引擎在过去几年中市场占比显著增长&#xff0c;其中亚洲市场增幅达到了30%&#xff0c;随着UE5的推出和技术的不断进步&#xff0c;UE引擎在独立开发者和移动游戏开发中的应用也在逐步增加。 UE引擎的优势在于强大的画面表现与视觉特效…...

统计函数运行时间的python脚本

这是一个统计函数运行时间的实用脚本&#xff0c;其中用到了函数的嵌套、链式传输参数&#xff0c;以及修饰器。 import time# 定义一个装饰器timer&#xff0c;用于计算被装饰函数的运行时间 def timer(func):print("执行了timer")def wrapper(*args, **kwargs):st…...

大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(3)

大模型WebUI&#xff1a;Gradio全解11——使用transformers.agents构建Gradio UI&#xff08;3&#xff09; 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.3 创建和使用工具Tools11.3.1 默认工具箱与load_tool11.3.2 创建新工具11.3.3 管理代理的工具箱toolbox11.3…...

spring boot知识点5

1.如何你有俩套配置环境&#xff0c;运行时如何选择 如果有俩套配置环境&#xff0c;则需要三个yml application.yml 用于配置你用那个配置环境 application-dev.yml 用于开发配置环境 application-prod.yml 用于发布配置环境 spring:profiles:active: prod # 指定当前激…...

【C++】面向对象的三大特性

面向对象编程三大核心特性&#xff1a;封装、继承和多态。 1. 封装 封装指的是将数据和操作这些数据的方法绑定在一起&#xff0c;形成一个对象&#xff0c;并且隐藏对象的内部实现细节&#xff0c;只暴露必要的接口。封装的目的是保护数据&#xff0c;确保外部代码不能直接访…...

Docker构建时,设定默认进入的工作目录的方法

在 Docker 中,你可以通过不同的方式来设定容器默认进入的目录,以下针对不同场景分别介绍具体方法: 1. 使用 Dockerfile 设定工作目录 如果你是通过构建镜像的方式来运行容器,那么可以在 Dockerfile 中使用 WORKDIR 指令来设置容器启动时的默认工作目录。以下是具体步骤:…...

DS4Windows终极指南:3步让PS手柄在Windows上完美兼容游戏

DS4Windows终极指南&#xff1a;3步让PS手柄在Windows上完美兼容游戏 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 还在为PC游戏无法识别你的PlayStation手柄而烦恼吗&#xff1f;每次连…...

Why Go Developers Avoid panic() - And When It‘s Actually Okay to Use

If youre coming to Go from another language, you might be surprised to find that Go developers dont really throw exceptions. In fact, they mostly avoid Go’s built-in panic() function unless absolutely necessary.But that doesn’t mean panic is bad. It just…...

从零构建ReAct智能体:基于TypeScript的LLM应用开发实践

1. 项目概述与核心思路最近在折腾大语言模型应用&#xff0c;发现很多框架要么太重&#xff0c;要么封装得太深&#xff0c;想改点东西都无从下手。特别是ReAct这种经典的“思考-行动”模式&#xff0c;虽然原理清晰&#xff0c;但真想自己从头实现一遍&#xff0c;把每个环节都…...

偏导数与梯度向量:多维空间优化的核心工具

1. 理解偏导数与梯度向量的核心价值第一次接触多元函数微积分时&#xff0c;那个突然增加的变量维度总会让人手足无措。单变量微积分中&#xff0c;我们只需要考虑一个方向的变化率&#xff0c;而到了三维甚至更高维空间&#xff0c;变化率突然变得"多面化"——这就是…...

C++26反射在现代框架开发中的革命性应用(LLVM/Clang 19.0实测源码揭秘)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;C26反射特性在元编程中的应用概览 C26 正式引入静态反射&#xff08;static reflection&#xff09;作为核心语言特性&#xff0c;通过 std::reflexpr 和配套的反射查询接口&#xff0c;使编译期获取类…...

ARM Cortex-R5双发射与ECC内存优化实战

1. ARM Cortex-R5处理器双发射机制深度解析1.1 双发射技术基础原理双发射(Dual Issue)是现代处理器提升指令级并行度(ILP)的关键技术之一。在ARM Cortex-R5处理器中&#xff0c;这一机制允许在单个时钟周期内同时发射两条指令到不同的执行单元。这种并行执行能力直接提升了每周…...

别再重装VSCode了!2026内存优化终极 checklist:12项配置项+8个进程级kill命令+1个自研memory-guard插件

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VSCode 2026内存优化的底层动因与诊断范式 VSCode 2026 版本将内存管理从“被动回收”转向“预测性约束”&#xff0c;其核心动因源于 Electron 28 对 V8 堆快照的细粒度控制能力&#xff0c;以及语言服…...

Spring Cloud 2027 边缘计算支持深度解析

Spring Cloud 2027 边缘计算支持深度解析 引言 随着物联网&#xff08;IoT&#xff09;和5G技术的快速发展&#xff0c;边缘计算已经成为云计算领域的重要发展方向。Spring Cloud 2027 作为 Spring 生态系统的最新版本&#xff0c;引入了对边缘计算的原生支持&#xff0c;这是…...

VCAM虚拟摄像头:安卓Xposed框架下的终极摄像头替换解决方案

VCAM虚拟摄像头&#xff1a;安卓Xposed框架下的终极摄像头替换解决方案 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam 在移动应用开发和内容创作领域&#xff0c;摄像头功能的重要性不言…...

字节面试被问“Claude Code怎么做搜索”?答RAG后就没后续了

最近和在社区看到&#xff0c;有个求职者面试字节的时候&#xff0c;聊到了一些rag相关问题&#xff0c;正好这个求职者就说自己用过claude写代码&#xff0c;面试官就问他&#xff1a;那你知道Claude Code检索代码用的是什么方式吗&#xff1f;他说是RAG吧&#xff0c;现在不都…...