一切开始之前
在一切开始之前,特别是针对深度学习和大模型项目,开发环境的搭建至关重要。搭建这样的环境往往繁琐且复杂,涉及到CUDA环境、PyTorch版本等多个因素,稍有不慎就可能导致包冲突或部署失败。因此,我们需要一个强大的环境搭建工具——Conda!
Conda
介绍
在介绍conda之前,小编先引用Anaconda官网中的一句话。
Anaconda® 是一个包管理器、一个环境管理器、一个 Python/R 数据科学发行版以及超过 7,500 个开源包的集合。Anaconda 是免费且易于安装的,它提供免费的社区支持。
翻译成人话来讲,那就是:
它允许你安装、更新和卸载各种库和依赖,更是一个环境管理器,能让你轻松创建、保存、加载和切换不同的开发环境。这意味着,你可以为每个项目设置独立的环境,每个环境中安装特定版本的库,从而有效避免版本冲突和依赖问题。并且,Conda可以自动处理环境中的依赖问题!
最重要的是:它免费!!!
为什么需要它?因为它极大简化了CUDA等复杂依赖的安装过程,只需一个命令即可完成。同时,Conda环境可以打包并移植到相同或类似硬件配置的环境中,使得开发到生产的部署过程更加顺畅。
Anaconda与Miniconda
很多人在装Conda环境的时候,会发现有两个版本的Conda环境,导致让人有些不知所措,不知道安装哪个环境。
它们两个分别是:Anaconda和Miniconda。
它们两个的主要区别,就在于Anaconda内置了Python和大量常用的数据科学、机器学习库,比如NumPy、Pandas、SciPy等。安装Anaconda后,用户几乎可以立即开始进行科学计算和数据分析工作,无需再单独安装这些库。
而对于Miniconda来说,它更加轻量级。它只包含了Python和Conda,但并没有预装其他的库。Miniconda用户需要手动安装他们需要的包,这使得Miniconda的环境更为简洁,可以根据实际需求来安装必要的包,避免不必要的存储占用。
对于我们来说,Anaconda没有必要安装,它太重了,占用的资源太多,所以我们这里,选择更加轻量级的Miniconda,因为它已经包含了我们所需要的全部东西,那就是Conda环境和Python。
(ps:不管是Anaconda还是Miniconda,里面所有的操作全部相同!Anaconda仅仅是预装了常用的学习库。)
(ps:如果你已经有了Python环境,依然可以安装Conda环境!)
安装
官网:Miniconda — Anaconda documentation
点击上面的官网链接,可以直接跳转到Miniconda的官网,接下来,你就会看见这样的画面。
在这个地方,我们可以选择下载Windows,macOS和Linux版本的。
安装步骤也非常简单,跟着安装步骤走就可以。
接下来就是添加环境变量了。确保你的Conda环境在任何地方都可以被使用。
your_path\miniconda
your_path\miniconda\Library\bin
your_path\miniconda\Scripts
接下来打开cmd,我们就看一看到Conda环境是否安装成功了!
conda --version
OK!安装成功!
如何使用Conda
当安装完成之后,我们就可以发现,在菜单中,出现了关于Conda环境相关的窗口。
点开它,你就会发现你进入了一个和cmd一样的小黑板,但是和cmd不同的是,它的前面出现了一个base。
这个时候就代表你进去了conda环境,前面的base,就是你当前使用的虚拟环境!
所有的conda在启动,或者进入时,都会首先进入到base环境,所以这个环境千万不要删除!
查看虚拟环境列表
此指令将会列出当前Conda中存在的所有虚拟环境。
conda env list
因为我们刚刚安装Conda环境,所以现在只有一个base虚拟环境,那么让我们来创建一个新的虚拟环境吧!
创建虚拟环境
此指令将会创建一个虚拟环境,并且指定虚拟环境中使用的Python版本。
conda create -n demo python=3.11
上述指令,创建了一个名称为demo,并且Python版本为3.11的虚拟环境。
现在,我们已经创建了一个新的虚拟环境了!
在Pycharm中配置虚拟环境
既然我们可以在命令中使用Conda,那么我们肯定想在IDE中使用Conda来进行开发!
这里,就可以看到我们创建的虚拟环境了!
点击demo,就可以为我们的项目配置一个Conda虚拟环境了!
两套虚拟环境
正如标题所言,我们需要两套虚拟环境,分别对应:Langchain环境和LLM环境。
首先为自己一个问题,为什么是两套?
在我们的LLM环境端,这个环境只做LLM服务的基础建设,其实大部分的情况下,只要基础大模型环境搭建完毕,它在往后所需要做的改变是非常小的,无非就是更换一下模型,或者是加载一下LoRA微调之后的大模型。
更多的时候!它几乎不做任何改变!
它只加载模型和推理,任何业务不在它这里实现!
它只提供基础服务!
而反之,在我们的Langchain环境端,它需要做的改变就会非常频繁,因为业务的变动和Demo不相同,业务几乎每时每刻都在变动。
新的代码需要测试,老的代码或许有着Bug…
所以,Langchain环境端,包的安装和替换是比LLM环境端更加频繁的!
这就解释了,我们为什么需要两个环境,一个环境主要负责部署LLM服务,另外一套环境,则主要部署Langchain服务。
这里又要引出了另外一个问题,小编你说了,一个环境负责部署LLM服务,一个环境负责部署Langchain环境,那是不是需要两个不同的服务器?
答案是肯定!
首先,对于LLM服务器,我们期望它有更强的算力,更好的安全性,更优秀的稳定性!
这样一来,我们的LLM和Embedding模型都需要部署在LLM环境中,让它提供基础服务,而不做其它操作。
而部署在其它服务器中的Langchain服务,它的作用就显而易见了,它只专注于业务,而不关注大模型的具体实现,它们中间通过HTTP交流,并且我们期望,LLM服务器永远只会对Langchain服务器开放访问,而拒绝一切其它的访问。
就算是Langchain服务器挂掉,也可以迅速重启,而不会直接击穿LLM服务,并且可以在Langchain端做更多的限流,熔断等等操作。
回答开头的问题,为什么要做两套环境:
一套用于LLM服务,另一套用于Langchain服务。这样做有助于业务分离,提高系统的清晰度和可维护性。同时,可以根据实际需求将这两套环境部署到不同的服务器上,以优化资源配置并提高系统的整体性能和稳定性。
Conda基础操作
查看虚拟环境列表
conda env list
创建虚拟环境
conda create -n 虚拟环境名称 python=3.11
切换虚拟环境
conda activate 虚拟环境名称
安装包
conda install 需要安装的包名
pip install 需要安装的包名
删除虚拟环境
conda remove -n 虚拟环境名称 --all
导出当前虚拟环境
conda env export > 文件名称.yaml
使用yaml创建环境
conda env create -f 文件名称.yaml
总结
- Conda是一个强大的包管理器和环境管理器,它允许用户为不同的项目创建独立的虚拟环境,从而避免库之间的冲突和依赖问题。
- 简化部署,一套环境,轻松打包,平移到相同的平台。
- Conda的基本操作,覆盖常用的场景。
- 两套环境,业务分离,有助于保持系统的清晰和可维护性,并且可以根据实际需求优化资源配置,提高系统的整体性能和可靠性。