Про colab знают, наверное, все. Этот инструмент позволяет независимым исследователям использовать облачную инфраструктуру с GPU и TPU бесплатно или почти бесплатно.

Как всегда, проблемы возникают на больших данных. Если ваш датасэт лежит в google drive (он же Диск), то вы можете обращаться к нему напрямую из colab. Однако, если файл велик, например, 70+ GiB, то процесс обучения будет существенно медленнее, чем если бы этот же файл лежал в локальном хранилище, которое выделяется при создании инстанса.

Выход - скопировать файл с Диска в локальное хранилище (обучение станет быстрее в несколько раз!). Но дело в том, что colab и вся инфраструктура очень умная, файлы с Диска кэшируются каким то неуправляемым вами алгоритмом. И если у вашего инстанса, допустим, доступно ~120 GiB, то 70 GiB с Диска вы не скопируете, у вас закончится свободное место как раз из-за системы кэширования. То есть, команда cp не отработает корректно. И rsync то же. И tar. Кэширование работает на уровне драйвера. По сути файл копируется в локальное хранилище дважды. Шах и мат!

Так что вот вам небольшой костылёк:

sh = """
#!/bin/bash

BIGFILE=/content/drive/MyDrive/DATA/combined/2021-12-29-combined.h5
OUTFILE=/content/2021-12-29-combined.h5
PARTSIZE=$((1*1024*1024*1024)) # 1 GiB
FILESIZE=$(stat -c%s "$BIGFILE")
echo "Size of $BIGFILE = $FILESIZE bytes."

CHUNKS=$((FILESIZE / PARTSIZE))
if (( FILESIZE % PARTSIZE == 0 ))
then
    echo "CHUNKS = $CHUNKS"
else
    ((CHUNKS = CHUNKS + 1))
    echo "CHUNKS = $CHUNKS"
fi

for ((i=0;i<$CHUNKS;i++));
do
	echo "Transfer CHUNK $i out of $CHUNKS"
  dd if=$BIGFILE bs=$PARTSIZE skip=$i count=1 iflag=sync oflag=sync >> $OUTFILE
  sleep 10
  sync
done
"""
with open('script.sh', 'w') as file:
  file.write(sh)

!bash script.sh

Можно прямо в ячейку вставлять! Идея в том, что бы копировать файл по частям, с небольшой задержкой. Тогда кэш переодически сбрасывается и всё нормально. Небольшой оверхэд всё равно есть (порядка 10-15 GiB). Можно было наверное этот скрипт как то изящнее офрмить, но он сейчас в рабочем состоянии. Может кому-то сэкономит время.

С Новым годом!

Комментарии (5)


  1. serejk
    02.01.2022 16:12
    +1

    Собственно, это они и предлагают делать:

    https://github.com/googlecolab/colabtools/issues/1915#issuecomment-804234540

    Попутно советуя приобрести Pro :-)


    1. jamm1985 Автор
      02.01.2022 16:16
      +1

      У меня Pro, но это не помогло )) Потому что у инстанса с GPU всего 120 GiB свободно. А обучение с диска на одну эпоху это в среднем час против 30 минут с локального хранилища. И ещё при обучении с диска в течении суток могут возникнуть ошибки с доступом к файлу и процесс прервётся.


      1. dimka11
        03.01.2022 02:51

        Какие видеокарты даёт сейчас Pro?


        1. jamm1985 Автор
          03.01.2022 06:58
          +2

          nvidia-smi
          Mon Jan  3 03:52:14 2022       
          +-----------------------------------------------------------------------------+
          | NVIDIA-SMI 495.44       Driver Version: 460.32.03    CUDA Version: 11.2     |
          |-------------------------------+----------------------+----------------------+
          | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
          | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
          |                               |                      |               MIG M. |
          |===============================+======================+======================|
          |   0  Tesla P100-PCIE...  Off  | 00000000:00:04.0 Off |                    0 |
          | N/A   36C    P0    32W / 250W |   4241MiB / 16280MiB |     11%      Default |
          |                               |                      |                  N/A |
          +-------------------------------+----------------------+----------------------+
                                                                                         
          +-----------------------------------------------------------------------------+
          | Processes:                                                                  |
          |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
          |        ID   ID                                                   Usage      |
          |=============================================================================|
          |  No running processes found                                                 |
          +-----------------------------------------------------------------------------+
          free -h
                        total        used        free      shared  buff/cache   available
          Mem:            25G        3.3G        198M         13M         21G         21G
          Swap:            0B          0B          0B
          cat /proc/cpuinfo
          
          cpu MHz         : 2199.998
          cache size      : 56320 KB
          physical id     : 0
          siblings        : 4
          core id         : 0
          cpu cores       : 2
          apicid          : 0
          initial apicid  : 0
          fpu             : yes
          fpu_exception   : yes
          cpuid level     : 13
          wp              : yes
          flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat md_clear arch_capabilities
          bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa
          bogomips        : 4399.99
          clflush size    : 64
          cache_alignment : 64
          address sizes   : 46 bits physical, 48 bits virtual
          power management:
          
          processor       : 1
          vendor_id       : GenuineIntel
          cpu family      : 6
          model           : 79
          model name      : Intel(R) Xeon(R) CPU @ 2.20GHz
          stepping        : 0
          microcode       : 0x1
          cpu MHz         : 2199.998
          cache size      : 56320 KB
          physical id     : 0
          siblings        : 4
          core id         : 1
          cpu cores       : 2
          apicid
          bogomips        : 4399.99
          clflush size    : 64
          cache_alignment : 64
          address sizes   : 46 bits physical, 48 bits virtual
          power management:
          
          processor       : 3
          vendor_id       : GenuineIntel
          cpu family      : 6
          model           : 79
          model name      : Intel(R) Xeon(R) CPU @ 2.20GHz
          stepping        : 0
          microcode       : 0x1
          cpu MHz         : 2199.998
          cache size      : 56320 KB
          physical id     : 0
          siblings        : 4
          core id         : 1
          cpu cores       : 2
          apicid          : 3
          initial apicid  : 3
          fpu             : yes
          fpu_exception   : yes
          cpuid level     : 13
          wp              : yes
          flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat md_clear arch_capabilities
          bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa
          bogomips        : 4399.99
          clflush size    : 64
          cache_alignment : 64
          address sizes   : 46 bits physical, 48 bits virtual
          power management:

          Это обычный Pro, тип машины с увеличенным объёмом памяти. Есть ещё машины на TPU, там памяти больше, но и возни с этим TPU тоже не мало.

          Сейчас появился план Pro+, там обещают ещё более мощные ресурсы, выполнение блокнотов в фоне, большее время работы инстансов. Правда стоит это в 5 раз дороже - почти 50 баксов в месяц.


          1. dimka11
            03.01.2022 07:18

            Раньше там можно было получить V100