Google Colaboratory(Colab)是一个由 Google 供给的云端 Jupyter 编程笔记本,直接经过浏览器即可进行 Python 编程。Colab 充分使用谷歌的搁置云计算资源,为大众供给免费的的在线编程服务,以及免费的 GPU 资源,虽然在运用方面有一定的规矩约束,但对于一般的研讨和学习来说绰绰有余。

在 Google Colab 中运用 JuiceFS

拜访 Colab,能够新建笔记本,也能够从 Google Drive、Github 载入笔记本,或直接从本地上传。

在 Google Colab 中运用 JuiceFS

Colab 免费供给的 Python 编程环境十分慷慨,如下图,足有 12 GB 的内存和 100 GB 的硬盘。

在 Google Colab 中运用 JuiceFS

假如需求运用硬件加速,能够切换运转时类型,笔者的账户能够免费运用 T4 GPU 和 TPU。

在 Google Colab 中运用 JuiceFS

不过需求留意,Colab 运转时是暂时的,渠道会监测运转时的活动状况,长时刻的搁置和长时刻的高强度运用,都会导致运转时被回收开释,所有数据都会被清空。

Colab 上的数据持久化

为了让 Colab 能够持久化地保存文件,人们通常会挑选运用 Google Drive。如下图,运用时在界面左边的文件办理中点击按钮即可将 Google Drive 挂载到运转时,把需求长时刻保存或重复运用的数据保存在里面,再次运用能够从 Google Drive 中加载,这就避免了运转被开释时丢失数据。

在 Google Colab 中运用 JuiceFS

除了 Google Drive 以外,你还能够运用 JuiceFS 作为 Colab 笔记本的持久化存储,然后更为灵敏地保存和同享更大规划的数据。

JuiceFS 与 Google Drive

这里先供给一个表格供读者参考,后文会展开介绍 JuiceFS 的技能架构以及怎么创立一个适用于 Google Colab 的文件体系。

简言之,Google Drive 有渠道优势,更容易集成到 Colab,也有多种容量规格以供扩容,但在运用上会有一些约束,比方单位时刻的总上传量,总文件数量等。而 JuiceFS 是自建服务,没有此类约束,并且在费用方面能够经过灵敏地安排资源来降低是用本钱。

JuiceFS Google Drive
价格 弹性费用(取决于元数据引擎和目标存储的费用) 按固定容量订阅
集成到 Colab 简略 简略
是否需求维护 需求 不需求
扩容能力 无容量上限 15GB ~ 30TB
上传约束 无约束 24 小时内可向云端硬盘上传和仿制 750 GB 数据
跨渠道同享 灵敏 一般

运用 JuiceFS

JuiceFS 是面向云的高功用分布式文件体系,它在 Apache-2.0 协议下开源,具有完备的 POSIX 兼容性,并支持 FUSE POSIX、HDFS、S3、Kubernetes CSI Driver、WebDAV 等多种拜访办法。

在 Colab 中能够直接采用 FUSE POSIX 办法,以守护进程办法挂载到运转时中运用。

技能架构

一个典型的 JuiceFS 文件体系由一个负责存储数据的目标存储和一个负责存储元数据的元数据引擎组成。

在 Google Colab 中运用 JuiceFS

在目标存储方面,JuiceFS 支持几乎所有公有云目标存储、私有布置的目标存储、NFS、SFTP 以及本地磁盘等。在元数据引擎方面,支持 Redis、Postgres、MySQL、TiKV、SQLite 等多种数据库。

由于采用了数据与元数据分离存储的架构,JuiceFS 文件体系的读和写操作会先在元数据引擎上进行查询和处理,只需涉及到实际数据时才会拜访目标存储,这样就能极高效地处理海量的数据,比较于直接与目标存储交互,JuiceFS 会有更好的功用表现。

简言之,元数据引擎至关重要,想要提升 JuiceFS 文件体系的功用,一个黄金法则是“尽量接近事务端布置元数据引擎”。以 Colab 为例,它的服务器大多坐落美国,所以找一个美国的云服务器来布置 Redis 并调配一个可靠的目标存储是构建 JuiceFS 文件体系相对抱负的调配。

适用于 Colab 的组合

元数据引擎

为了在 Colab 上尽量发挥 JuiceFS 的潜能,笔者挑选了一个坐落美国硅谷的云服务器,将它用于布置 Redis 作为 JuiceFS 的元数据引擎,装备如下:

  • 方位:美国硅谷
  • CPU:2 核
  • RAM:4GB
  • SSD: 60GB
  • 体系:Ubuntu Server 22.04
  • IP:18.18.18.18
  • 域名:redis.xxx.com

注:上述 IP 和域名均为演示意图编写,如有需求请替换成你的实在信息

依照 JuiceFS 官方供给的数据,采用 Redis 这类键值数据库作为元数据引擎时,存储占用大约为 300 字节/文件,那么 1GB 内存大约能够存储 350 万个文件的元数据,读者能够依据预期的文件总量来决定给服务器装备多少内存。

在本文中,笔者运用 Docker 布置 Redis,并经过 Let’s Encrypt 签发了一个免费的 SSL 证书对服务端进行加密:

# 拉取 redis 镜像
sudo docker pull bitnami/redis:7.2
# 删除已存在的同名 redis 容器(假如存在的话)
sudo docker rm -f redis
# 创立新的 redis 容器
sudo docker run -d --name redis 
-p 6379:6379 
-v redis_aof_data:/bitnami/redis/data 
-v ./ssl:/ssl 
-e REDIS_PASSWORD=abcdefg 
-e REDIS_TLS_ENABLED=yes 
-e REDIS_TLS_PORT_NUMBER=6379 
-e REDIS_TLS_AUTH_CLIENTS=no 
-e REDIS_TLS_CERT_FILE=/ssl/redis.xxx.com.crt 
-e REDIS_TLS_KEY_FILE=/ssl/redis.xxx.com.key 
-e REDIS_TLS_CA_FILE=/ssl/ca.crt 
--restart unless-stopped 
bitnami/redis:7.2

该 Redis 实例启用了以下功用:

  • AOF(追加写到本地文件):它会将每个写操作都记录到本地磁盘,然后提高数据的安全性。
  • 服务端 SSL:Redis 服务器会运用 SSL/TLS 协议与客户端进行通讯。将 SSL 证书放在 ssl 目录中即可,留意修正环境变量中的证书文件名称。

Redis 布置完毕后,还需求检查防火墙,保证服务器开放了 6379 端口的入站请求。这样,Redis 元数据引擎就预备完毕了。

目标存储

目标存储方面,笔者挑选运用 Cloudflare R2,由于它上下行流量均免费,只需为存储和 API 请求付费,很适合 Colab 这种需求在外部拜访 JuiceFS 的场景。特别是存储量较大的状况,每次都要将模型数据载入到 Colab 运转时,下行收费会产生不小的开支。

以下是演示意图编写的目标存储信息,请在实际装备时替换成自己的实在信息:

创立文件体系

元数据引擎和目标存储都预备好了,接下来运用 JuiceFS 客户端来创立文件体系。

这个过程能够在任何一台支持装置 JuiceFS 客户端的电脑上执行,能够是你本地正在运用的电脑或是布置了 Redis 实例的那台云服务。

由于 JuiceFS 是根据云的,只需 JuiceFS 客户端能够拜访到元数据引擎和目标存储就能够创立和运用。

首先,装置 JuiceFS 客户端:

# macOS 或 Linux 体系
curl -sSL https://d.juicefs.com/install | sh -
# Windows 体系(主张运用 Scoop)
scoop install juicefs

其他体系及装置办法请参考 JuiceFS 官方装置文档

然后,运用已预备的元数据引擎和目标存储来创立文件体系:

# 创立文件体系
juicefs format --storage s3 
--bucket https://xxx.r2.cloudflarestorage.com/myjfs 
--access-key abcdefg 
--secret-key gfedcba 
rediss://:abcdefg@redis.xxx.com/1 
myjfs

JuiceFS 文件体系只需求创立一次,然后就能够在任何装置了 JuiceFS 客户端的设备上挂载和运用,它是根据云的同享文件体系。能够多设备、跨地区、跨网络一起读写拜访。

现在你能够在任何装置了 JuiceFS 客户端的设备上挂载运用这个文件体系,以下是几种常用的拜访办法:

# 以 FUSE POSIX 办法挂载
juicefs mount rediss://:abcdefg@redis.xxx.com/1 mnt
# 以 S3 Gateway 办法挂载
export MINIO_ROOT_USER=admin  
export MINIO_ROOT_PASSWORD=12345678
juicefs gateway rediss://:abcdefg@redis.xxx.com/1 localhost:9000
# 以 WebDAV 办法挂载
juicefs webdav rediss://:abcdefg@redis.xxx.com/1 localhost:8000

能够看到,挂载 JuiceFS 文件体系时只需指定元数据引擎 URL,不再需求目标存储相关的信息。这是由于在创立文件体系的时候,目标存储相关的信息现已被写入了元数据引擎。

在 Colab 中挂载 JuiceFS

如下图,Colab 运转时的底层是一个 Ubuntu 体系,所以,只需求在 Colab 上装置 JuiceFS 客户端,执行挂载指令即可运用。

在 Google Colab 中运用 JuiceFS

能够将装置指令和挂载指令放在一个代码块中,也能够像下图这样,将它们分红两个独立的代码块。

在 Google Colab 中运用 JuiceFS

请留意,挂载 JuiceFS 时不要忘掉 -d 选项,它的作用是让 JuiceFS 以守护进程的办法挂载到后台。由于 Colab 每次只允许一个代码块运转,假如不将 JuiceFS 挂载到后台,他就会一直让代码块处于运转状况,导致其他代码块无法运转。

如下图,左边文件办理器中能够看到已挂载的 JuiceFS 文件体系。

在 Google Colab 中运用 JuiceFS

运用举例

例一:用 JuiceFS 保存 Fooocus 模型

Fooocus 是开源的 AI 图片生成器,底层仍然运用 Stable Diffusion 模型,但将杂乱的参数进行了调优和封装,让用户能够获得像 Midjourney 相同简略直观的作图体验。

你能够直接运用 Fooocus 官方供给的 Colab Notebook,在其基础上添加装置和挂载 JuiceFS 文件体系的代码块。

也能够参考以下代码更灵敏地创立和办理 Fooocus 相关的代码:

# 装置 JuiceFS 客户端
!curl -sSL https://d.juicefs.com/install | sh -
# 挂载 JuiceFS 文件体系
!juicefs mount rediss://:abcdefg@redis.xxx.com/1 myjfs -d
# 在 JuiceFS 中创立 Fooocus 模型目录结构
!mkdir -p myjfs/models/{checkpoints,loras,embeddings,vae_approx,upscale_models,inpaint,controlnet,clip_vision}
# 克隆 Fooocus 库房
!git clone https://github.com/lllyasviel/Fooocus.git

在 Fooocus 项目根目录创立一个自定义的 config.txt 文件,让 Fooocus 以 JuiceFS 中的目录作为默认的模型存储目录:

{
  "path_checkpoints": "/content/myjfs/models/checkpoints",
  "path_loras": "/content/myjfs/models/loras",
  "path_embeddings": "/content/myjfs/models/embeddings",
  "path_vae_approx": "/content/myjfs/models/vae_approx",
  "path_upscale_models": "/content/myjfs/models/upscale_models",
  "path_inpaint": "/content/myjfs/models/inpaint",
  "path_controlnet": "/content/myjfs/models/controlnet",
  "path_clip_vision": "/content/myjfs/models/clip_vision"
}

启动 Fooocus

!pip install pygit2==1.12.2
%cd /content/Fooocus
!python entry_with_update.py --share

初度运用需求从公共库房下载模型,这会需求一些时刻,你能够在本地一起挂载 JuiceFS 文件体系,调查模型保存的状况。

再次运用时,只需挂载 JuiceFS 文件体系并保证 Fooocus 能够从中读取模型。程序会动态地从 JuiceFS 拉取所需的模型,尽管这仍然需求一些时刻,但比较每次都从公共库房彻底从头下载要愈加方便。特别是模型经过微调或产生了自定义数据状况,运用 JuiceFS 保存相应数据的优势就会愈加明显。

例二:用 JuiceFS 保存 Chroma 向量数据库

在 Colab 上构建 RAG(检索增强生成)使用也是比较常见的,这往往涉及到要把各种资料生成的 embedding 数据保存到向量数据库。

Llamaindex 默认采用 OpenAI 的 text-embedding 模型对输入的数据进行向量化,假如不想每次都从头生成 embedding 数据,就需求将这些数据保存到向量数据库。比方运用开源的 Chroma 向量数据库,由于它默认将数据保存在本地磁盘,在 Colab 中需求留意数据库的保存方位,以防运转时回收造成数据丢失。

这里笔者供给一组 Colab 笔记本代码,让你能够将 Llamaindex 生成的 embedding 保存到 Chroma 数据库,而这个 Chroma 数据库将彻底保存到 JuiceFS。

# 装置 JuiceFS 客户端
!curl -sSL https://d.juicefs.com/install | sh -
# 挂载 JuiceFS 文件体系
!juicefs mount rediss://:abcdefg@redis.xxx.com/1 myjfs -d
# 装置 Llamaindex 和 chroma 相关的包
!pip install llama-index chromadb kaleido python-multipart pypdf cohere
# 从 Colab 环境变量读取 OpenAI API 密钥
from google.colab import userdata
import openai
openai.api_key = userdata.get('OPENAI_API_KEY')

把需求转换成 embedding 的文件放在 myjfs/data/ 目录中,执行以下代码生成 embedding 并保存到 Chroma。

得益于 JuiceFS 根据云的同享拜访特性,能够一起在本地挂载 JuiceFS 并将所需的资料放入相应的目录。

import chromadb
from llama_index import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores import ChromaVectorStore
from llama_index.storage.storage_context import StorageContext
# load some documents
documents = SimpleDirectoryReader("./myjfs/data").load_data()
# initialize client, setting path to save data
db = chromadb.PersistentClient(path="./myjfs/chroma_db")
# create collection
chroma_collection = db.get_or_create_collection("great_ceo")
# assign chroma as the vector_store to the context
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# create your index
index = VectorStoreIndex.from_documents(
    documents, storage_context=storage_context,
    embed_model_name="text-embedding-3-small",
)

运用时,直接让 Chroma 从 JuiceFS 读取数据。

import chromadb
from llama_index import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores import ChromaVectorStore
from llama_index.storage.storage_context import StorageContext
# initialize client, setting path to save data
db = chromadb.PersistentClient(path="./myjfs/chroma_db")
# create collection
chroma_collection = db.get_or_create_collection("great_ceo")
# assign chroma as the vector_store to the context
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 从向量数据库加载索引
index = VectorStoreIndex.from_vector_store(
    vector_store, storage_context=storage_context
)

测试一下用自己 Index 作为知识库与 GPT 进行对话:

# create a query engine and query
query_engine = index.as_query_engine()
response = query_engine.query("这本书讲了什么?")
print(response)

这样一来,每次进入新的 Colab 运转时,只需挂载 JuiceFS 就能够直接运用这些已创立的向量数据。其实,不止是在 Colab,任何需求拜访这些向量数据的当地都能够经过挂载 JuiceFS 来运用。

总结

本文介绍了怎么在 Google Colab 中运用 JuiceFS 来持久化保存数据,经过实例介绍了怎么为 JuiceFS 预备元数据引擎和目标存储来尽量发挥它的功用,以及在 Colab 中的装置和挂载办法。最后经过 Fooocus 和 Chroma 两个比如,演示了在实际使用中怎么使用 JuiceFS 来更好地保存并重复使用数据。

希望这篇文章的内容能够对你起到一定的协助,假如你有任何疑问,欢迎在评论区留言评论。假如你对 JuiceFS 有爱好,能够检查官方文档了解更多用法和功用调优方面的内容。

希望这篇内容能够对你有一些协助,假如有其他疑问欢迎参加JuiceFS 社区与大家共同沟通。