在google-colab中,保存已有的module环境到google drive后调用时遇到问题
我尝试通过在运行代码时将 Python 环境和模型保存到自己的 Google Drive 中,从而改进 Google Colab 文档。这样,在删除运行时并在第二天使用代码时,可以无需下载全部内容即可正常运行。
我使用了虚拟环境方法来下载模块。模型下载部分进行得很顺利,但在尝试调用已保存的模块时遇到了问题(我认为它们已保存,但在尝试使用时无法调用)。
Colab 链接:https://colab.research.google.com/drive/1y8NHYiItax3yvKLy6BbcLwGP4Kjq_FZU?usp=sharing *对于混乱的代码表示抱歉.我对 Python 还不太熟悉.
以下是代码中设置参数的部分:
# 配置 vits 所在文件夹名称
Drive_Name = 'Vi' #@param {type:'string'}
# 连接到 Google Drive
drive.mount('/content/gdrive')
gdrive_path = '/content/gdrive/MyDrive/'
# 创建目录
vi_dir = os.path.join(gdrive_path, Drive_Name)
webui_dir = os.path.join(gdrive_path, Drive_Name, 'vits-models')
以下是下载模块的部分:
#@title 6-下载需要的模块(忽略)
!pip install virtualenv
!virtualenv /content/gdrive/MyDrive/colab_env
!source /content/gdrive/MyDrive/colab_env/bin/activate; python3 -m pip install pip==21.3.1; pip install -r $webui_dir/requirements.txt
import sys
sys.path.append("/content/gdrive/MyDrive/colab_env/lib/python3.8/site-packages")
以下是出现问题的部分(在尝试运行程序时):
import sys
sys.path.append("/content/gdrive/MyDrive/colab_env/lib/python3.8/site-packages")
import numpy
print('Yes')
!source /content/gdrive/MyDrive/colab_env/bin/activate && /content/gdrive/MyDrive/colab_env/bin/python3 $webui_dir/app.py --share --device cuda --all
最后这段代码返回以下结果:
Yes
Traceback (most recent call last):
File "/content/gdrive/MyDrive/Vi/vits-models/app.py", line 5, in <module>
import utils
File "/content/gdrive/MyDrive/Vi/vits-models/utils.py", line 7, in <module>
import numpy as np
ModuleNotFoundError: No module named 'numpy'
我感到非常困惑。我可以看到 numpy 已经存在于我的虚拟环境中,而且我认为路径设置没有错误。我还将其添加到 sys.path 中,但问题仍然存在。
我尝试将最后一段代码改为:
import sys
sys.path.append("/content/gdrive/MyDrive/colab_env/lib/python3.8/site-packages")
import numpy
print('Yes')
!python3 $webui_dir/app.py --share --device cuda --all
现在返回:
Yes
Traceback (most recent call last):
File "/content/gdrive/MyDrive/Vi/vits-models/app.py", line 9, in <module>
import gradio as gr
ModuleNotFoundError: No module named 'gradio'
我在 site-packages 文件夹中进行了检查,确实找不到 gradio 文件夹。但是当第一次运行模块安装代码时,我可以在控制台中看到以下内容:
Collecting gradio==3.17.0
Using cached gradio-3.17.0-py3-none-any.whl (14.2 MB)
这是我的 Google Drive 结构:
顺便说一下,gradio 不在 site-packages 文件夹中)
因此,我真的很困惑代码的哪一部分出了问题. 请有人能帮忙吗?或者使用不同的方法来实现这个功能. 欢迎访问链接 (在问题上面)尝试运行代码(包含错误)。
我期望代码在删除运行时并打开新的运行时后能再次运行。结果是,代码只在安装模块的运行时中正常运行,而在打开新的运行时后无法正常运行。
提前感谢!
引用gtp回答 有帮助的采纳一下哟
仔细检查了你的代码和环境,发现有几个可能的原因导致无法调用保存的模块:
virtualenv myenv
source myenv/bin/activate # 激活环境
# 保存环境
zip -r myenv.zip myenv
drive.mount('/content/gdrive')
重新挂载Google Drive。基于new bing部分指引作答:
问题可能是由于虚拟环境的设置和调用方式引起的。虚拟环境的激活和调用需要在同一个命令或脚本中完成,而在Colab中使用感叹号(!)运行的命令是在独立的子进程中执行的,无法保持环境的连续性。
为了解决这个问题,你可以尝试以下方法:
1、将所有安装模块和启动应用程序的命令整合到一个脚本中,并使用 ! 运行该脚本。这样可以确保所有命令在同一个环境中执行,避免环境切换问题。例如,你可以创建一个名为 run_app.sh 的脚本,内容如下:
#!/bin/bash
source /content/gdrive/MyDrive/colab_env/bin/activate
pip install -r /content/gdrive/MyDrive/Vi/vits-models/requirements.txt
python /content/gdrive/MyDrive/Vi/vits-models/app.py --share --device cuda --all
然后在Colab中运行该脚本:
!bash run_app.sh
2、将需要的模块和应用程序复制到Colab的运行时中,而不是在每次运行时下载和安装。你可以将模块和应用程序文件夹直接上传到Colab,然后在Colab中直接导入和使用它们,而无需使用虚拟环境和Google Drive。
你可以通过以下步骤来实现:
在本地计算机上将所需的模块和应用程序文件夹打包为一个zip文件。
将zip文件上传到Colab中(可以使用Colab的文件上传功能)。
在Colab中解压缩zip文件,并将模块和应用程序导入到你的代码中。
这样,你就不需要在每次运行时都下载和安装模块,而是直接使用Colab中的本地副本。
希望以上解决方案能够帮助你解决问题。
虚拟环境路径设置不正确吧
把Colab运行后生成的文件保存到Google drive
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
!mkdir -p drive
!google-drive-ocamlfuse drive
from google.colab import drive
drive.mount('/content/drive/')
进入指定目录,因为我的代码是直接新建后跑的,因此与drive都在\content目录下
import os
os.chdir('/content')