通过 Colab 下载 Google Driver 上的大文件到内网服务器

这里写自定义目录标题

    • 1. 将 Google Driver 上的大文件下载到 Colab
      • 1.1 获取文件唯一的 fileID
      • 1.2 查看文件的 MD5 值
      • 1.3 获取 API 的 Access Token
      • 1.4 下载文件到 Colab
    • 2. 将文件从 Colab 下载到公网服务器
    • 3. 将文件从公网服务器下载到内网服务器
    • 4. 参考链接

由于众所周知的原因,访问 Google Driver 不是那么地方便,尤其是在下载一些较大的数据集时,尽管可以通过 IDM 来实现断点续传,但下载速度也就只有几 M,对于几十个 G 的文件来说还是太慢了。

偶然间看到一篇使用 Colab 来下载大文件的方法,实验下来速度确实很快,虽然把数据弄到内网要费点周折,但已经算是一个不错的方法,特此记录一下。

1. 将 Google Driver 上的大文件下载到 Colab

访问 Colab 官网,每个人默认有大约 80G 左右的免费空间,如下图所示,这里我下载了一个 53 G 的大文件后,可用空间还有 31 G。

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第1张图片

所以,我们可以从 Google Driver 上下载小于 80 G 的文件,如果文件更大的话,此方法可能不适用,或者要升级 Colab 获取更多的硬盘空间。

1.1 获取文件唯一的 fileID

假设我们要下载的文件地址是下面这个链接:

https://drive.google.com/file/d/1NyDrgI02ao18WmXyepgVkWGqtM3YS3_4/view

那么加粗部分即为文件唯一的 fileID,我们需要通过这个 fileID 来使用命令将文件下载到 Colab 上。

如果是 Google Driver 上的任意文件,我们可以通过右键->共享->复制链接来获得类似上面 URL 形式的一个文件地址。

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第2张图片

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第3张图片

比如,这个 trainval.json 的地址即为下面这个链接,同理,加粗部分为文件唯一的 fileID。

https://drive.google.com/file/d/1PiaK8BD3D_OyS9rcrGmn9HfLDxnP_MY-/view?usp=sharing

1.2 查看文件的 MD5 值

由于整个过程包括文件下载和跨服务器的传输,难免哪一步会出些差错,所以我们需要一个办法来保证每一步得到的文件都是没有问题的,通过 MD5 来验证文件的一致性是一个不错的方案。

所以,我们需要先拿到 Google Driver 上文件的 MD5 值,好在这可以通过 Google 的 API 来获取到。

首先,我们打开 Google Developers - OAuth 2.0 Playground 这个网址,然后,按照下图指示进行第一步操作。

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第4张图片

点击完会跳出登录界面,我们用自己的 Google 账号认证然后允许即可。然后,继续按照下图指示进行第二步操作。

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第5张图片

第三步,填入 Request URI,然后点击 Send the request,我们就可以在右边的 Response 中得到某一个文件的 MD5 值了。

知道文件的 fileID 后,替换下面加粗部分我们即可得到对应的 Request URI 。

[https://www.googleapis.com/drive/v3/files/1NyDrgI02ao18WmXyepgVkWGqtM3YS3_4?fields=md5Checksum,+originalFilename]

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第6张图片

1.3 获取 API 的 Access Token

与 1.2 节一样,打开 Google Developers - OAuth 2.0 Playground 这个网址,这里第一步选取了另外的一个 API,然后进行认证。

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第7张图片

第二步操作与 1.2 节一致,只不过这里操作完后需要把这个 Access token 复制保存下来,后面要用到。注意这里的 token 有效期为一个小时,超时后无法使用,不过在 Colab 下载的速度可以达到百兆每秒,一个小时可以说绰绰有余。

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第8张图片

1.4 下载文件到 Colab

[!curl -H “Authorization: Bearer Access token” https://www.googleapis.com/drive/v3/files/fileID?alt=media -o filename]

替换上面命令加粗部分的 Access token、fileID 和 filename,就得到了在 Colab 中下载文件的命令,下面是一个示例。

!curl -H "Authorization: Bearer ya29.a0AVvZVsqLM6FcukNv8Co2wOornTU-mktbMSBkIhVQRvU7iHq47UyvXWXcKxV8_RT4Fybs6YmYUAj0EYeWe3CL2wa1T5COZwDb_Mq7w6CDFExvb4Og7tND8QaC3UaZ4FDR5yqwIS5bBJ1LJHeEcE7P6lsoz6LDaCgYKARESARESFQGbdwaIoVi4AMvpUGVnEPyiiFaj1w0163" https://www.googleapis.com/drive/v3/files/1NyDrgI02ao18WmXyepgVkWGqtM3YS3_4?alt=media -o planes_scannet_train.tfrecords

点击左边的执行按钮后,下载就开始了,速度飞起!

但是,我在下载的时候老是会中断,下个几 G 或者十几 G 就停掉了。好在 curl 命令可以从断点重启,修改为下面的命令,继续执行,重复几次后就可以完成下载了。

!curl -H "Authorization: Bearer ya29.a0AVvZVsqLM6FcukNv8Co2wOornTU-mktbMSBkIhVQRvU7iHq47UyvXWXcKxV8_RT4Fybs6YmYUAj0EYeWe3CL2wa1T5COZwDb_Mq7w6CDFExvb4Og7tND8QaC3UaZ4FDR5yqwIS5bBJ1LJHeEcE7P6lsoz6LDaCgYKARESARESFQGbdwaIoVi4AMvpUGVnEPyiiFaj1w0163"  -o planes_scannet_train.tfrecords -C - https://www.googleapis.com/drive/v3/files/1NyDrgI02ao18WmXyepgVkWGqtM3YS3_4?alt=media

下载完成后,验证一下 MD5 值,这里一致说明第一步的下载没有问题。

2. 将文件从 Colab 下载到公网服务器

由于 Colab 无法直接访问内网服务器,但是内网服务器可以访问公网,所以这里需要一个公网服务器作为中转,先把文件从 Colab 通过 scp 拷贝到公网服务器,然后在内网服务器上通过 scp 再把文件从公网服务器拷贝到内网服务器。

找一个按小时付费的云服务器,这里我用的是 AutoDL 平台,新用户注册送 10 元优惠券,最便宜的服务器大概 1 元一小时,够下载好几次了。

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第9张图片

在 Colab 上生成 SSH-Key,拷贝到公网服务器上。

!ssh-keygen -t rsa               # 运行命令后一直回车即可生成 SSH-Key
!cp /root/.ssh/id_rsa.pub ./	 # 将公钥拷贝到当期目录

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第10张图片

将文件 id_rsa.pub 下载下来,把其中的内容拷贝到服务器上这个文件中 ~/.ssh/authorized_keys2,一般情况下文件名应该是 authorized_keys,我这个服务器叫 authorized_keys2。

假设连接公网服务器的命令如下:

ssh -p 39624 [email protected]

那么,从 Colab 拷贝文件到公网服务器的命令为:

!rsync -avuzP -e "ssh -p 39624 -o StrictHostKeyChecking=no"  planes_scannet_train.tfrecords [email protected]:/root/autodl-tmp

我这里用的是 rsync 命令,实测速度会快一些,用 scp 命令也可以。

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第11张图片

平均速度大概 30 M,拷贝一个 53 G 的文件用时 27 分。拷贝完成后,同样地,在公网服务器再次验证一下 MD5 值。

3. 将文件从公网服务器下载到内网服务器

登录内网服务器,直接运行以下命令:

rsync -avuzP -e "ssh -p 39624 -o StrictHostKeyChecking=no"   [email protected]:/root/autodl-tmp/planes_scannet_train.tfrecords ./

输入公网服务器的登录密码后开始拷贝,平均速度有 40 M,相当可以了。

通过 Colab 下载 Google Driver 上的大文件到内网服务器_第12张图片

最后,在内网服务器验证一下 MD5 值,如果一致的话就大功告成了。

4. 参考链接

如何快速下载google drive文件到本地?
Google Drive MD5 checksum for files

你可能感兴趣的:(Ubuntu,环境配置,服务器,人工智能,数据分析)