Autodl算力云实战:高效上传本地数据集与代码的完整指南

1次阅读
没有评论

共计 2943 个字符,预计需要花费 8 分钟才能阅读完成。

image.webp

背景痛点

在使用 Autodl 算力云时,很多开发者都会遇到上传本地数据集和代码的效率问题。传统的 scp 上传方式虽然简单直接,但在面对大规模数据时显得力不从心。主要痛点包括:

Autodl 算力云实战:高效上传本地数据集与代码的完整指南

  • 传输速度慢,尤其是跨地域上传时
  • 没有断点续传功能,网络波动时容易前功尽弃
  • 无法实现增量同步,每次都要全量上传
  • 缺乏进度显示,难以预估完成时间

这些问题在训练大型深度学习模型时尤为突出,因为数据集通常都在几十 GB 甚至更大规模。

技术方案对比

针对上述问题,我们对比了几种常见的上传方案:

1. SCP 基础传输

scp -r local_folder username@autodl-instance:/remote/path

优点:简单易用,无需额外配置
缺点:无断点续传,无增量同步,速度慢

2. Rsync 增量同步

rsync -avzP --partial local_folder username@autodl-instance:/remote/path

优点:支持增量传输和断点续传,速度更快
缺点:首次同步仍需全量传输

3. 压缩传输

tar czf - local_folder | ssh username@autodl-instance "tar xzf - -C /remote/path"

优点:减少传输量,适合小文件多的情况
缺点:需要额外 CPU 资源进行压缩 / 解压

4. API 直传

通过 Autodl 提供的 SDK 直接上传

优点:可集成到自动化流程
缺点:需要额外开发工作

核心实现

Rsync 增量同步实战

推荐的生产环境用法:

rsync -avzP \
    --partial \
    --progress \
    --exclude=".git" \
    --exclude="__pycache__" \
    -e "ssh -p 12345" \
    local_folder/ \
    username@region.autodl.com:/remote/path/

参数详解

  • -a:归档模式,保持文件属性
  • -v:详细输出
  • -z:压缩传输
  • -P:显示进度并支持断点续传
  • --partial:保留部分传输的文件
  • --exclude:排除不需要同步的目录
  • -e:指定 SSH 端口(Autodl 通常使用非标准端口)

Python 自动化上传脚本

import os
import tarfile
import paramiko
from tqdm import tqdm

def compress_and_upload(local_path, remote_path, hostname, port, username, password):
    """
    压缩本地目录并通过 SFTP 上传

    参数:
        local_path: 本地目录路径
        remote_path: 远程目标路径
        hostname: Autodl 实例地址
        port: SSH 端口
        username: 用户名
        password: 密码
    """
    # 创建临时压缩文件
    temp_archive = f"{local_path.rstrip('/')}_temp.tar.gz"

    try:
        # 使用进度条显示压缩过程
        with tarfile.open(temp_archive, "w:gz") as tar:
            files = [f for f in os.listdir(local_path) if not f.startswith('.')]
            with tqdm(total=len(files), desc="Compressing") as pbar:
                for file in files:
                    tar.add(os.path.join(local_path, file), arcname=file)
                    pbar.update(1)

        # SFTP 传输
        transport = paramiko.Transport((hostname, port))
        transport.connect(username=username, password=password)
        sftp = paramiko.SFTPClient.from_transport(transport)

        # 带进度显示的上传
        file_size = os.path.getsize(temp_archive)
        with tqdm(total=file_size, unit='B', unit_scale=True, desc="Uploading") as pbar:
            def callback(sent, total):
                pbar.update(sent - pbar.n)

            sftp.put(temp_archive, os.path.join(remote_path, os.path.basename(temp_archive)), callback=callback)

        print("Upload completed successfully!")
        return True

    except Exception as e:
        print(f"Error occurred: {str(e)}")
        return False

    finally:
        # 清理临时文件
        if os.path.exists(temp_archive):
            os.remove(temp_archive)
        if 'sftp' in locals():
            sftp.close()
        if 'transport' in locals():
            transport.close()

# 使用示例
if __name__ == "__main__":
    compress_and_upload(
        local_path="./dataset",
        remote_path="/root/data",
        hostname="region.autodl.com",
        port=12345,
        username="your_username",
        password="your_password"
    )

性能优化

我们对不同压缩算法进行了测试(数据集:10GB 混合文件):

方法 压缩耗时 传输耗时 总耗时 压缩率
无压缩 0s 25m 25m 100%
gzip 3m 12m 15m 65%
bzip2 8m 10m 18m 55%
xz 15m 8m 23m 45%
zstd 2m 9m 11m 50%

结论

  • 对于 CPU 受限的环境,推荐使用 gzip
  • 如果追求极致压缩率且时间充裕,可以选择 xz
  • zstd 在压缩速度和压缩率之间取得了很好的平衡

避坑指南

1. 权限问题

Autodl 实例通常使用 root 用户,但本地文件可能有权限限制。解决方案:

rsync -avzP --no-perms --no-owner --no-group ...

2. 路径错误

常见错误是路径结尾的斜杠:

  • folder/ 表示同步目录内容
  • folder 表示同步目录本身

3. 断网恢复

使用 rsync 的 --partial--progress参数可以恢复中断的传输:

rsync --append ...

安全性考量

  1. SSH 加密:Autodl 默认使用 SSH 加密传输,确保数据安全
  2. 敏感数据处理
  3. 避免在脚本中硬编码密码,建议使用 SSH 密钥
  4. 对特别敏感的数据可以先用 gpg 加密再传输
  5. 临时文件清理:自动化脚本要确保删除临时压缩文件

总结与建议

经过实际测试,对于频繁更新的代码库,推荐使用 rsync 进行增量同步;对于一次性上传的大型数据集,使用 zstd 压缩后传输效率最高。建议读者:

  1. 根据数据更新频率选择合适的传输方式
  2. 对不同规模的数据集进行传输测试,建立自己的性能基准
  3. 将常用上传命令封装成脚本,提高工作效率

期待大家在评论区分享自己的优化经验和技巧!

正文完
 0
评论(没有评论)