Обходим файловый кэш Google Drive в Colab

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Про 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."

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

for ((i=0;i<$CHANKS;i++));
do
	echo "Transfer CHANK $i out of $CHANKS"
  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). Можно было наверное этот скрипт как то изящнее офрмить, но он сейчас в рабочем состоянии. Может кому-то сэкономит время.

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

Источник: https://habr.com/ru/post/599115/


Интересные статьи

Интересные статьи

В предыдущей статье мы с вами разобрались с тем, как использовать функцию UNNEST для работы с повторяющимися записями в Google BigQuery. В этой статье мы идём дальше, и п...
Привет Хабр!Сегодня расскажу еще одну историю из своей жизни - в этот раз не про свой “чудо-сервер” в двух частях, а про что-то более приземленное, но так или иначе связа...
Когда тот, кто работает в сфере Data Science, собирается показать результаты своей деятельности другим людям, оказывается, что таблиц и отчётов, полных текстов, недостаточно для того чтоб...
Одним тёплым вечером жена сказал что стала владельцем нашим Музеем Мирового океана, находящимся в Калининграде. Она просто нажала на кнопку "Я владелец компании" в Google...
Google недавно выпустила в публичный доступ новую версию Google Analytics под названием App + Web. Симо Ахава уже написал отличную пошаговую инструкцию о том, как начать работать с инструментом, ...