云上使用 Stable Diffusion ,模型数据如何共享和存储

news2024/11/26 14:51:15

随着人工智能技术的爆发,内容生成式人工智能(AIGC)成为了当下热门领域。除了 ChatGPT 之外,文本生成图像技术更令人惊艳。

Stable Diffusion,是一款开源的深度学习模型。与 Midjourney 提供的直接将文本转化为图像的服务不同的是它允许用户自行搭配并训练自己的图像风格,这一特性吸引了众多的开发者。

也正因此,用户需要下载和安装模型数据来进行模型训练。模型数据是指用于训练和生成图像的数据集,它们通常占用很大的空间,并且需要经常更新和同步。模型文件小则几百 MB,大则几十上百 GB。如果用户在不同的计算机上使用 Stable Diffusion ,或者是团队进行共创,就需要在每台计算机上下载和安装相同的模型数据,这样既浪费时间又浪费空间。而且,如果用户没有及时备份模型数据,就有可能因为意外损坏或丢失而造成不可挽回的损失

那么,有没有一种方法可以实现模型数据的持久化和共享存储呢?答案是肯定的。

本文将介绍如何使用 JuiceFS 云服务创建一个文件系统,让它可以像移动硬盘一样,在任何部署了 Stable Diffusion 应用的计算机上插上即可使用,特别是对于团队使用的情况,JuiceFS 的共享存储能力可以令多个设备共享同一份预训练模型数据。

一、JuiceFS 简介

JuiceFS 是一款面向云原生设计的高性能分布式文件系统,在 Apache 2.0 开源协议下发布。提供完备的 POSIX 兼容性,可将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同时在跨平台、跨地区的不同主机上挂载读写。

如图所示,JuiceFS 文件系统由元数据引擎和对象存储组成,元数据引擎用来存储文件名、大小、权限等元数据信息,对象存储用来存储文件的数据块。使用基于网络的对象存储和数据库创建 JuiceFS 文件系统,它就具备了跨平台、跨网络的共享访问能力。

为了解决对象存储和数据库的时延问题,JuiceFS 引入了缓存层,它会将频繁访问的数据缓存到本地,提升访问速度。缓存层可以根据用户的配置自动管理缓存空间和策略,保证数据的一致性和完整性。通过缓存层,JuiceFS 可以实现毫秒级的延迟和近乎无限的吞吐量。

JuiceFS 文件系统支持多种访问接口,包括 FUSE POSIX 挂载、S3 Gateway、CSI Driver、Hadoop HDFS API、WebDAV 等。既可以将 JuiceFS 挂载到本地像网盘一样使用,也可以通过专用接口将 JuiceFS 接入到特定平台使用。

二、使用 JuiceFS 创建共享存储

JuiceFS 有开源的社区版和付费的云服务版,它们的核心架构是一致的,区别在于社区版所需的数据库和对象存储均需要用户自行搭建,而云服务使用 JuiceFS 官方提供的数据库,同时提供了更多高级功能。使用 JuiceFS 云服务版,用户只需自备对象存储,在 JuiceFS 官网创建文件系统即可,整体会更简单方便。

因此本文会直接采用 JuiceFS 云服务。对于想尝试上手的用户不用担心它的费用,创建一个 1TB 容量的文件系统目前是免费的。

说明:JuiceFS 云服务价格方案中的容量是指用户在平台上可以创建的文件系统的最大容量。一个文件系统由平台提供的数据库和用户自备的对象存储组成,用户通过 JuiceFS 客户端访问和读写文件系统,文件数据实际上是存储在用户自己的对象存储中的。换言之,免费档支持创建一个 1TB 的文件系统,就是指这个文件系统最多可以向用户的对象存储中存入 1TB 的数据。

创建文件系统

访问 JuiceFS 官网 https://juicefs.com,注册并登录到云服务后台。

点击“创建文件系统”按钮,填写信息并创建文件系统。

创建文件系统主要涉及以下选项:

  1. 文件系统名称:根据格式要求设置,名称需要平台唯一;
  2. 服务器区域:如果你的 Stable Diffusion 安装在云服务器上,那么就选择你所使用的云平台及所在的区域。如果你在本地电脑上安装使用 Stable Diffusion 则选择你的对象存储所在的云平台及区域。
  3. 回收站保存时间:这是 JuiceFS 的数据安全机制,开启回收站后,文件不会立即删除而是根据设置的时长继续保留在对象存储中,超期后才会实际删除。对于 Stable Diffusion 模型数据存储的场景,可以设置 0 关闭回收站。
  4. Bucket 名称:即用户自备对象存储的桶名称,你可以提前在云平台上创建存储桶,然后把桶名称填写在这里,也可以在稍后挂载 JuiceFS 文件系统时由客户端自动创建。
  5. 其他选项:保持默认即可

安装客户端并挂载文件系统

文件系统创建完成以后,会自动跳转到“设置”页面。现在,你可以在任何需要使用这个文件系统的计算机上执行以下命令安装客户端:

sudo curl -L https://juicefs.com/static/juicefs -o /usr/local/bin/juicefs && sudo chmod +x /usr/local/bin/juicefs

JuiceFS 是基于云的文件系统,免费档支持 100 台设备同时挂载使用,也就是说,你现在就可以在任意一台电脑上挂载并使用它,存入 Stable Diffusion 模型数据,然后在其他同样需要使用这些模型数据的服务器上同时挂载这个文件系统,让你所有的设备都能共享使用同一份预训练模型。

提示:JuiceFS 云服务版目前仅支持 macOS 和 Linux 系统,如果你希望在 Windows 系统上使用,可以通过 WSL 进行使用。你也可以尝试 JuiceFS 社区版,详情参考社区版文档。

三、使用 Stable Diffusion 访问共享存储

准确来说,Stable Diffusion 并不是一个单一的软件,而是一系列开放源码的 AI 模型。要想使用这些模型来生成图像,就必须先安装或访问可以运行模型的程序或平台,比如基于网页的 Stable Diffusion web UI、桌面版的 DiffusionBee、iPad 适用的 Draw Things 等。

如果你不想为了 AI 作图预先投入大量资金在电脑硬件上,可以考虑使用云计算平台提供的 GPU 云服务器,一些抢占式实例每小时单价可能低至几元。下图是一台抢占式实例,它拥有 8 核 CPU、32GB 内存、100GB SSD 硬盘和一块 NVIDIA Tesla T4 显卡(16GB GPU),单位价格相对较低。但抢占式实例的特点是会在平台上出现更高的出价者时,服务器会被自动释放销毁,所以在使用这种云服务器时要格外注意模型数据的保存

接下来就以 GPU 云服务器为例,介绍如何安装 Stable Diffusion web UI。稍后你会发现,对于这种使用 Stable Diffusion 的方式而言,JuiceFS 的共享访问特性简直是如虎添翼。

安装 Stable Diffusion web UI

这里假设在腾讯云创建了一个上述配置的 GPU 云服务器,它使用 Ubuntu 22.04 系统。首先需要安装依赖的软件包和 NVIDIA 显卡驱动:

# 安装依赖
sudo apt install build-essential libgl1 dkms
# 切换至 root 用户
su
# 下载驱动(请到 NVIDIA 官网查找最新版链接,这里只是一个示例)
wget https://cn.download.nvidia.com/tesla/460.106.00/NVIDIA-Linux-x86_64-460.106.00.run
# 安装显卡驱动
sh NVIDIA-Linux-x86_64-460.106.00.run --ui=none --disable-nouveau --no-install-libglvnd --dkms -s
# 检查驱动是否安装成功(返回显卡信息代表安装成功)
nvidia-smi

显卡驱动安装完毕,建议重启系统。然后,以普通用户身份安装 Stable Diffusion web UI 程序。

# 安装项目依赖
sudo apt install wget git python3 python3-venv
# 安装 Stable Diffusion web UI
bash <(wget -qO- https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh)

运行 Stable Diffusion web UI

Stable Diffusion web UI 安装在Python venv 虚拟环境中,因此,在启动之前需要先激活虚拟环境。

# 激活虚拟环境
source venv/bin/activate
# 启动程序
python webui.py – –listen

程序启动成功以后,就可以通过浏览器访问了,假设云服务器的 IP 地址为 111.222.33.44,则访问地址为 111.222.33.44:7860。

用 JuiceFS 存储模型

Stable Diffusion web UI 的模型文件位于 models 目录,根据类型把模型文件放到对应的文件夹即可,比如在 civitai 网站下载的 checkpoint 类型的模型就放到 models/Stable-diffusion 目录,而 VAE 模型则放到 models/VAE 目录。

了解了保存模型的目录结构,接下来就可以把 JuiceFS 文件系统挂载到模型目录了,回到 JuiceFS 官网控制台,打开文件系统的“设置”选项卡,如下图所示。

先将 JuiceFS 文件系统挂载到当前用户的 $HOME/jfs 目录,挂载过程中程序会询问文件系统的 token 以及对象存储 Access Key 和 Secret Key,根据提示输入即可。

sudo /usr/local/bin/juicefs mount mymodels $HOME/jfs

提示:请将挂载命令中 mymodels 替换成你的文件系统名,最后的挂载点路径也可以替换成你想要的路径。

文件系统挂载成功以后,你现在可以把 $HOME/jfs 当作网盘来使用了,所有存入这个目录的文件都会保存到关联的对象存储中。与此同时,你可以在其他电脑上安装 JuiceFS 云服务客户端,执行相同的挂载命令,共享读写其中存储的文件。

你可以把所有预训练模型都拷贝到 $HOME/jfs 目录,不过,为了科学管理不同类型的模型,建议在 $HOME/jfs 中建立与 models 目录对应目录结构,比如创建一个 SD 目录专门存储 Stable-diffusion 适用的模型,建一个 VAE 目录存储 VAE 模型,再创建一个 Lora 目录存储 Lora 相关的模型,依此类推。

在 JuiceFS 文件系统中根据模型类别创建目录对之后的使用会很有帮助,这便于使用 JuiceFS 的子目录挂载功能将特定的目录挂载到 models 下对应的子目录中,从而避免修改项目配置调整读取模型的位置。可以使用 JuiceFS 的子目录挂载功能,也可以使用软连接将子目录映射到 Stable Diffusion 模型目录中。

比如,可以将 SD 目录挂载到 $HOME/stable-diffusion-webui/models/Stable-diffusion/jfs,将 VAE 目录挂载到 $HOME/stable-diffusion-webui/models/VAE/jfs 等。

注意:这里假设 Stable Diffusion web UI 部署在 $HOME 目录,请根据实际信息替换子目录、挂载点路径和文件系统名称。

# 挂载子目录 SD 到 models/Stable-diffusion/jfs
sudo juicefs mount mymodels --subdir SD $HOME/stable-diffusion-webui/models/Stable-diffusion/jfs
# 挂载子目录 VAE 到 models/VAE/jfs
sudo juicefs mount mymodels --subdir VAE $HOME/stable-diffusion-webui/models/VAE/jfs

同样地,也可以使用软连接来将 JuiceFS 的目录映射到模型目录:

# 假设文件系统挂载在 $HOME/jfs
ln -s $HOME/jfs/SD $HOME/stable-diffusion-webui/models/Stable-diffusion/jfs

挂载成功以后,在应用界面的左上角点击刷新按钮即可看到所有可用的模型,如下图所示。

不要忘记,JuiceFS 是共享文件系统,使用同样的挂载方式,你可以把模型数据挂载到其他云服务器或本地电脑上。

四、训练自己的 Stable Diffusion 模型

除了使用预训练模型开箱即用的“文生图”、“图生图”功能以外,Stable Diffusion 的另一大优势就是可以通过任意基础模型训练自己的模型。

Stable Diffusion 做模型训练的常用方式主要有以下几种:

  • 全模型微调:用新数据集进一步训练基础模型,可以保持基础模型能力,同时提升模型的质量和效果。但需要更多的时间和资源,也可能导致模型过拟合或欠拟合。

  • Lora 微调:为基础模型注入低秩矩阵,让模型能够适应新的数据和任务,可以简单的理解为给基础模型“打补丁”。优点是节省时间和计算资源,不会破坏基础模型的能力。但这种方式也需要更多数据和训练技巧,基础模型的能力可能会成为它的局限。

  • DreamBooth 微调:使用少量特定主题图片对基础模型进行微调,产生一个可以独立使用的新模型。优点在于只需要准备少量的训练图片,但可能导致新模型失去基础模型的特点或能力。

  • 文本反转:效果与 DreamBooth 原理类似,但实现方法不同。同样是让模型学会新的主题或风格,最终产生需要与基础模型一起使用的文件。缺点是在使用时需要通过特定的关键词来激活新训练的概念。

这里以 DreamBooth 为例介绍如何在 Stable Diffusion web UI 中进行微调训练。

DreamBooth 的原理

图片源自:https://github.com/google/dreambooth

如上图所示,DreamBooth 的原理是用 3~5 张特定主题(比如一只小狗不同角度)照片对 Stable Diffusion 的基础模型进行训练,从而让模型掌握这个特定的对象(比如,一只名为“Lafa”的狗)的特征。然后用“a Lafa dog in a bucket”(一只在桶里的 Lafa 狗)作为提示词,模型就会生成这只小狗在桶里的照片。也就是说,只要提示词中使用“a Lafa dog”,他就会直接使用这只小狗的特征来作图,而不是随机生成一只其他的狗。

在 Stable Diffusion web UI 中使用 DreamBooth

Stable Diffusion web UI 默认没有安装 DreamBooth 扩展,需要在 extensions 中搜索并安装。

安装完成后,切换到 Installed 选项卡,点击 Apply and restart UI 按钮。如果仍然没有显示 DreamBooth 的选项卡,则需要重启 Stable Diffusion web UI。

初次用 DreamBooth 微调,需要先创建一个新模型,如下图所示,输入新模型的名称,并选择基础模型。创建新模型需要一定的时间,具体取决于硬件配置。

现在重新选中刚刚新创建的模型,我们要对它进行微调训练。将准备好的照片放到 Stable Diffusion web UI 能够读取到的位置。

然后在 Input 部分的 Concepts 选项卡中添加所准备照片的实例提示词、类别提示词以及反向提示词,另外还应该根据硬件配置调整训练的轮次、算法等设置。

值得注意的是,在准备用于训练模型的图片时应该选择一个人或物体不同角度的照片,尽量保证主体特征清晰没有遮挡,数量在 3~5 张即可,图片尺寸要保持与训练参数设置的规格一致,默认为 512x512 像素。

设置就绪,点击 Train 开始训练,具体的训练时长取决于所采用的硬件和训练周期等参数的设置。

默认情况下,训练时模型数据会自动写入新创建的模型,你可以随时切换到“文生图”检查模型的效果,在训练完毕后,可以点击 Generate Ckpt 按钮将模型保存成 .ckpt 模型文件。

如下图所示,我用 5 张巧克力盒子作为输入,训练了一个名为 godi_box 的物体,只要在 Prompt 中使用这个关键词,他就会在场景中生成这个盒子。

同样地,使用 DreamBooth 训练的模型位于 models/dreambooth 目录,你可以用前面介绍的方法在 JuiceFS 文件系统中提前创建 DreamBooth 目录并挂载到 Stable Diffusion 中。

# 挂载子目录 dreambooth 到 models/dreambooth
sudo juicefs mount mymodels --subdir dreambooth $HOME/stable-diffusion-webui/models/dreambooth

五、总结和提示

本文介绍了如何使用 JuiceFS 云服务创建一个共享存储,实现 Stable Diffusion 预训练模型数据的共享使用。JuiceFS 是一款面向云原生设计的高性能分布式文件系统,它可以将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同时在跨平台、跨地区的不同主机上挂载读写。JuiceFS 为 Stable Diffusion 提供了一种高效、可靠、易用的共享存储方案,解决了模型数据存储的难题。

在使用 JuiceFS 和 Stable Diffusion 的过程中,有一些注意事项和提示,我们在这里简要列举如下:

  • 对象存储的存储和流量费用:使用 JuiceFS 时,用户需要自行承担对象存储的存储和流量费用,特别是跨网络使用的下行流量费用,以及读写请求费用。建议用户尽可能使用与云服务器相同平台、相同区域的对象存储,从而充分利用平台的内网线路节约开销。对于使用本地电脑的用户,对象存储建议选择与自己物理距离近的地区,同时可以选用云平台的存储包、流量包、请求包等资源来降低使用成本。

  • JuiceFS 的缓存空间和策略:JuiceFS 会将频繁访问的数据缓存到本地,提升访问速度。用户可以根据自己的需求和硬盘空间来配置缓存空间和策略,如设置缓存大小、缓存有效期、缓存清理策略等。具体的配置方法可以参考 JuiceFS 的文档。

希望本文能够帮助您更好地使用 Stable Diffusion 来创作自己的数字艺术作品。如果您有任何问题或建议,欢迎联系我们。感谢您的阅读和支持。

如有帮助的话欢迎关注我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于JAVA的心理咨询预约系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 心理健康在现代社会中…

vue js vue3 uniapp日期操作工具类组件,格式化、加减日月年

官网文档 官网&#xff1a;https://momentjs.com/ 文档&#xff1a;https://momentjs.com/docs/ 安装 npm install moment -s全局引用 import moment from moment;//uniapp vue3 全局引用 app.config.globalProperties.$moment moment;日期格式 示例&#xff1a;YYYY-MM-…

Unity3d_shader_Outline()

1、[Unity] 引入“全局轮廓”&#xff0c;只需附加组件即可使用轮廓着色器 【Unity】コンポーネントをアタッチするだけでアウトラインシェーダが使用できる「Global Outline」紹介 - コガネブログ 下载&#xff1a;https://github.com/rickomax/globaloutline 2、[Unity] 綺…

latent-diffusion model环境配置,这可能是你能够找到的最细的博客了

文章目录 前言一、环境配置1.创建requirement.txt文件2.提前从Github上下载好taming-transformers和clip3.创建conda环境&#xff0c;并安装requirement.txt文件4.安装torch 1.85.本地下载Bert模型权重&#xff0c;修改加载Bert的代码6.测试环境 2.训练自己的LDM模型 前言 最近…

几个基于springboot在线服务过段时间突然停掉的原因

有几个基于springboot的服务今天发现突然停掉了&#xff0c;也不知道什么原因&#xff0c;所以只能看一下日志了 主要日志如下&#xff1a; 2023-06-17 14:26:21.775 DEBUG o.s.b.f.s.DefaultListableBeanFactory- Retrieved dependent beans for bean dataSource: [mybatisCo…

使用了并发工具类库,线程安全就高枕无忧了吗?

1、说明 在代码审核讨论的时候&#xff0c;我们有时会听到有关线程安全和并发工具的一些片面的观点和结论&#xff0c;比如“把 HashMap 改为 ConcurrentHashMap&#xff0c;就可以解决并发问题了呀”&#xff0c;“要不我们试试无锁的 CopyOnWriteArrayList 吧&#xff0c;性能…

并发线程 (2) - C++线程间共享数据【详解:如何使用锁操作】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 快乐在于态度&#xff0c;成功在于细节&#xff0c;命运在于习惯。 Happiness lies in the attitude, s…

【机器学习】——神经网络与深度学习

目录 引入 一、神经网络及其主要算法 1、前馈神经网络 2、感知器 3、三层前馈网络&#xff08;多层感知器MLP&#xff09; 4、反向传播算法 二、深度学习 1、自编码算法AutorEncoder 2、自组织编码深度网络 ①栈式AutorEncoder自动编码器 ②Sparse Coding稀疏编码 …

(一)OC对象本质---内存布局

Apple OSS Distributions GitHubApple Open Source 开源源码链接 面试题1 一个NSObject对象占用多少内存&#xff1f; 系统分配了16个字节给NSObject对象&#xff08;通过malloc_size函数获得&#xff09; ​​​​​​​但NSObject对象内部只使用了8个字节的空间&#xf…

【状态估计】粒子滤波器、Σ点滤波器和扩展/线性卡尔曼滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

推荐一些简单却很实用的工具,快收藏起来吧

第一个工具&#xff1a;remove.bg 这是一个在线抠图的神器&#xff0c;它能够帮助你轻松地消除图片中的背景。相信很多人都知道&#xff0c;手动抠图真的很累&#xff0c;抠着抠着就会觉得烦躁。但是&#xff0c;使用这个神器&#xff0c;你只需要点击上传图片&#xff0c;就能…

Git安装与使用方法入门

目录 Git简介 Git下载与安装 Git配置环境变量 Git使用方法入门 Git简介 Git是一个帮助开发者追踪代码变化和团队协作的工具。它记录了代码修改的历史&#xff0c;并允许回到过去的版本。开发者可以创建分支来独立开发新功能&#xff0c;而不影响主代码。团队成员可以共享代…

@EnableScheduling和@Scheduled注解详解fixedrate和fixeddelay的区别

一、pom.xml中导入必要的依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent><dependencies><…

Selenium教程__元素定位(2)

Selenium操作页面上的文本输入框、按钮、单选框、复选框等&#xff0c;凡是能在页面显示的任何元素都需要先对元素进行定位。 Selenium提供了以下方法来定位页面中元素&#xff1a; find_element_by_id&#xff1a;通过id属性值进行匹配查找&#xff0c;返回匹配到的第一个元…

利用zOffice SDK实现合同续签系统

经过用户调研和实际考察发现。商务、政务和个人的真实使用场景中&#xff0c;很多用户会有通过“用户数据”“固定模板”生成“批量合同&#xff08;文件&#xff09;”的需求&#xff0c;并且存在着使用痛点。在在线办公不断发展的今天&#xff0c;我们需要一个在线编辑的工具…

使用Jsoup工具解析页面数据

前提是需要联网 F12打开浏览器控制台&#xff0c;通过元素找到需要爬取的数据 1、添加网页解析依赖 <!--解析网页依赖--> <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version&g…

【id:21】【1分】E. DS单链表--类实现

题目描述 用C语言和类实现单链表&#xff0c;含头结点 属性包括&#xff1a;data数据域、next指针域 操作包括&#xff1a;插入、删除、查找 注意&#xff1a;单链表不是数组&#xff0c;所以位置从1开始对应首结点&#xff0c;头结点不放数据 类定义参考 输入 n 第1行先输…

GRE over IPsec VPN配置

GRE over IPsec VPN配置 【实验目的】 理解GRE Tunnel的概念。理解GRE over IPsec VPN的概念。掌握GRE Tunnel的配置。掌握GRE over IPsec VPN的配置。验证配置。 【实验拓扑】 实验拓扑如下图所示。 实验拓扑 设备参数表如下表所示。 设备参数表 设备 接口 IP地址 子网…

Ziya:一个自回归、双语、开源和多功能的大语言模型

什么是Ziya&#xff1f; Ziya是一个基于LLaMa的130亿参数的中英双语预训练语言模型&#xff0c;它由IDEA研究院认知计算与自然语言研究中心&#xff08;CCNL&#xff09;推出&#xff0c;是开源通用大模型系列的一员。Ziya具备翻译&#xff0c;编程&#xff0c;文本分类&#…

JS中遍历对象的方法讲解

文章目录 for...in循环当使用for...in循环遍历对象时&#xff0c;需要注意以下几点&#xff1a; Object.keys()方法结合forEach()循环Object.entries()结合forEach()循环Object.getOwnPropertyNames()方法结合forEach()循环 在JavaScript中&#xff0c;有几种常用的方法可以用来…