Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
72b3cca
01/4 start
pdumin Apr 4, 2022
304af4c
1/4 finished
pdumin Apr 6, 2022
3c07c01
1/5 finished
pdumin Apr 6, 2022
4b92903
1/5 update toc
pdumin Apr 6, 2022
24fba99
1/6 finished
pdumin Apr 6, 2022
85a3d6c
1/7 finished
pdumin Apr 6, 2022
43ffc5e
1/8 finished
pdumin Apr 6, 2022
3ef1820
1/9 finished
pdumin Apr 6, 2022
5cd7fc1
1/4 fix
pdumin Apr 6, 2022
30446cc
toc update
pdumin Apr 6, 2022
7b76cf6
Merge branch 'main' into main
pdumin Apr 12, 2022
72d475b
3/1 finished
pdumin Apr 13, 2022
1108881
toc updated after 3/1
pdumin Apr 13, 2022
1f37c12
3/2 in progress
pdumin Apr 13, 2022
4f4da2b
3/2 in progress
pdumin Apr 18, 2022
a61d7fc
3/2 finished
pdumin Apr 20, 2022
53e4279
3/3 wip
pdumin Apr 22, 2022
4fad644
3/3 finished
pdumin Apr 27, 2022
f21733c
Merge branch 'main' into main
pdumin Apr 27, 2022
c2344bd
Update _toctree.yml
pdumin Apr 27, 2022
0ca5359
Update _toctree.yml
pdumin Apr 27, 2022
19a16fb
Update chapters/ru/_toctree.yml
pdumin Apr 28, 2022
de72e92
Merge branch 'huggingface:main' into main
pdumin May 20, 2022
206a4d6
Merge branch 'main' of github.com:pdumin/course 3/4
pdumin May 20, 2022
e5242eb
4/5 finished
pdumin May 23, 2022
b3b78cc
chapter3/quiz finished
pdumin May 24, 2022
1092439
merge
pdumin Jun 10, 2022
2a1e5c2
chapter 3 finished
pdumin Jun 10, 2022
b7c77c3
some fixes
pdumin Jun 10, 2022
46423ac
toc updated
pdumin Jun 10, 2022
b824230
Merge branch 'main' into main
pdumin Jun 10, 2022
62a5269
Fix in toc
pdumin Jun 10, 2022
838c11b
Update _toctree.yml
pdumin Jun 10, 2022
ff615d3
4/1 finished
pdumin Jun 14, 2022
e424085
4/2 finished
pdumin Jun 14, 2022
12a0453
3/5 update
pdumin Jun 14, 2022
4d7a172
Merge branch 'main' of github.com:pdumin/course
pdumin Jun 14, 2022
d4e2e41
toc updated
pdumin Jun 14, 2022
6264004
Update _toctree.yml
pdumin Jun 14, 2022
671c472
WIP chapter 4
pdumin Jun 22, 2022
75e8757
Merge branch 'main' of github.com:pdumin/course
pdumin Jun 22, 2022
abba8da
Merge branch 'huggingface:main' into main
pdumin Jun 28, 2022
4d7b28d
chapter 4/3 finished
pdumin Jun 28, 2022
4d04545
Merge branch 'main' of github.com:pdumin/course
pdumin Jun 28, 2022
3877fb4
4/3 fix toc updated
pdumin Jun 28, 2022
fb07b98
4/4 finished
pdumin Jun 28, 2022
50b5f7c
4/5 finished
pdumin Jun 28, 2022
f0c7560
quiz4 finished
pdumin Jun 28, 2022
71df5fa
chapter5/1 finished
pdumin Jul 1, 2022
2ad54b2
5/1 fix
pdumin Jul 1, 2022
31f925e
5/2 finished
pdumin Jul 1, 2022
a2e18dd
Merge branch 'huggingface:main' into main
pdumin Jul 1, 2022
26b5d5a
5/1 fix
pdumin Jul 4, 2022
dcad075
5/3 WIP
pdumin Jul 4, 2022
801b7ea
Merge branch 'main' of github.com:pdumin/course
pdumin Jul 4, 2022
abd456f
5/3 WIP
pdumin Jul 4, 2022
02d5ca3
Merge branch 'huggingface:main' into main
pdumin Jul 11, 2022
7a6dcef
5/3 lines 410-415 should be fixed
pdumin Jul 13, 2022
9d10e6d
Merge branch 'huggingface:main' into main
pdumin Aug 2, 2022
4fc9e6b
Merge branch 'huggingface:main' into main
pdumin Aug 22, 2022
271313a
Merge branch 'huggingface:main' into main
pdumin Sep 20, 2022
0ba614c
5/3 аштшырув
pdumin Sep 20, 2022
685c4aa
Merge branch 'main' of github.com:pdumin/course
pdumin Sep 20, 2022
c0f1007
4/5 finished
pdumin Sep 20, 2022
b16ae4c
title fix
pdumin Sep 20, 2022
2635eaa
toc upd
pdumin Sep 20, 2022
7b26de6
ch5/6 finished
pdumin Sep 22, 2022
ac05b5b
ср5/7 finished
pdumin Sep 22, 2022
d5b1d6b
chapter 5 finished
pdumin Sep 22, 2022
a0ddb57
Update chapters/ru/chapter5/1.mdx
pdumin Sep 26, 2022
d4c3663
ch6/1 finished
pdumin Sep 27, 2022
73afae0
ch6/2finished
pdumin Sep 27, 2022
a74c1d8
Merge branch 'main' of github.com:pdumin/course
pdumin Sep 27, 2022
54e5f00
ср5/2 ашч
pdumin Sep 27, 2022
7941e06
toc upd
pdumin Sep 27, 2022
b59e4ea
fix
pdumin Sep 27, 2022
ae12870
toc upd
pdumin Oct 1, 2022
14a7e75
toc fix
pdumin Oct 1, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion chapters/ru/_toctree.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,26 @@
title: Первая часть завершена!
- local: chapter4/6
title: Итоговый тест по главе
quiz: 4
quiz: 4
- title: 5. Библиотека 🤗 Datasets
sections:
- local: chapter5/1
title: Введение
- local: chapter5/2
title: Что делать, если моего датасета на нет на Hub?
- local: chapter5/3
title: Препарируем 🤗 Datasets
- local: chapter5/4
title: Big data? 🤗 Datasets спешат на помощь!
- local: chapter5/6
title: Семантический поиск с помощью FAISS
- local: chapter5/7
title: 🤗 Datasets, итоги!
- local: chapter5/8
title: Тест по главе 5
- title: Бибилиотека 🤗 Tokenizers
sections:
- local: chapter6/1
title: Введение
- local: chapter6/2
title: Обучение токенизатора на основе существующего
17 changes: 17 additions & 0 deletions chapters/ru/chapter5/1.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Введение

В [главе 3](/course/ru/chapter3) вы поверхностно ознакомились с библиотекой 🤗 Datasets и увидели три главных шага для использования ее в процессе fine-tuning:

1. Загрузить датасет из Hugging Face Hub.
2. Произвести препроцессинг с помощью `Dataset.map()`.
3. Загрузить и вычислить метрики.

Но это лишь малая часть того, на что способна 🤗 Datasets! В этой главе мы углубимся в библиотеку и попутно мы найдем ответы на следующие вопросы:

* Что делать, когда нужного набора данных нет в Hub?
* Как вы можете разделиить датасет? (Что если вам _действительно_ нужно использовать Pandas?)
* Что делать, когда ваш набор данных огромен и «расплавит» оперативную память вашего ноутбука?
* Что, черт возьми, такое «отображение памяти» (memory mapping) и Apache Arrow?
* Как вы можете создать свой собственный датасет и отправить его в Hub?

Принципы, которые вы изучите в этой главе, подготовят вас к более глубокому использованию токенизации и fine-tuning'а моделей в [главе 6](/course/ru/chapter6) и [главе 7](/course/ru/chapter7) – заваривайте кофе и мы начинаем!
163 changes: 163 additions & 0 deletions chapters/ru/chapter5/2.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
# Что делать, если моего датасета на нет на Hub?

<DocNotebookDropdown
classNames="absolute z-10 right-0 top-0"
options={[
{label: "Google Colab", value: "https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/chapter5/section2.ipynb"},
{label: "Aws Studio", value: "https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/chapter5/section2.ipynb"},
]} />

Вы знаете, как использовать [Hugging Face Hub](https://huggingface.co/datasets) для скачивания датасетов, но часто складывается ситуация, когда нужные данные не хранятся у вас локально или на удаленном сервере. В этом разделе мы посмотрим, как библиотека 🤗 Datasets может быть использована для загрузки датасетов, которые не хранятся на Hugging Face Hub.

<Youtube id="HyQgpJTkRdE"/>

## Работа с локальными и удаленными датасетами

🤗 Datasets предоставляет скрипты для загрузки собственных датасетов. Библиотека поддерживает несколько распространенных форматов:

| Data format | Loading script | Example |
| :----------------: | :------------: | :-----------------------------------------------------: |
| CSV & TSV | `csv` | `load_dataset("csv", data_files="my_file.csv")` |
| Text files | `text` | `load_dataset("text", data_files="my_file.txt")` |
| JSON & JSON Lines | `json` | `load_dataset("json", data_files="my_file.jsonl")` |
| Pickled DataFrames | `pandas` | `load_dataset("pandas", data_files="my_dataframe.pkl")` |

Как показано в таблице, для каждого формата мы должны задать тип скрипта загрузки в функции `load_dataset()` вместе с аргументом `data_files`, который указывает путь к одному или нескольким файлам. Начнем с загрузки набора данных из локальных файлов; позже мы увидим, как сделать то же самое с файлами, расположены на удаленном сервере.

## Загрузка локального датасета

Для этого примера мы будем использовать датасет [SQuAD-it dataset](https://github.com/crux82/squad-it/). Это большой датасет для задачи question answering на итальянском языке.

Обучающая и тестовая часть расположены на GitHub, мы можем скачать файлы с помощью простой команды `wget`.

```python
!wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-train.json.gz
!wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-test.json.gz
```
Выполнение этих команд запустит процесс скачивания файлов *SQuAD_it-train.json.gz* и *SQuAD_it-test.json.gz*, которые мы можем распаковать с помощью Linux команды `gzip`:

```python
!gzip -dkv SQuAD_it-*.json.gz
```

```bash
SQuAD_it-test.json.gz: 87.4% -- replaced with SQuAD_it-test.json
SQuAD_it-train.json.gz: 82.2% -- replaced with SQuAD_it-train.json
```
После выполнения команд мы увидим, что архивы будут заменены файлами _SQuAD_it-train.json_ и _SQuAD_it-text.json_ в формате JSON.

<Tip>
✎ Причина, по которой в примере выше перед командами расположен `!` заключается в том, что мы выполняем их в Jupyter notebook. Если вы хотите запустить эти команды в терминале – просто удалите `!`.
</Tip>

Для загрузки JSON файла с помощью функции `load_dataset()` необходимо знать, с каким типом JSON-файла мы имеем дело: обычный JSON (похожий на вложенный словарь) или JSON, сформированный построчно. Как и многие датасеты для задач question-answering, SQuAD-it использует формат обычного JSON'а с текстом, хранящимся в поле `data`. Это означает, что мы можем подгрузить датасет, задав аргумент `field` следующим образом:

```py
from datasets import load_dataset

squad_it_dataset = load_dataset("json", data_files="SQuAD_it-train.json", field="data")
```

По умолчанию при загрузке локальных файлов создается объект `DatasetDict` с меткой `train`. Мы можем изучить объект `squad_it_dataset`:

```py
squad_it_dataset
```

```python out
DatasetDict({
train: Dataset({
features: ['title', 'paragraphs'],
num_rows: 442
})
})
```

Выше распечатана информация об объекте: число строк и колонки обучающего датасета. Мы можем посмотреть на один объект, проиндексировав его как `train` следующим образом:

```py
squad_it_dataset["train"][0]
```

```python out
{
"title": "Terremoto del Sichuan del 2008",
"paragraphs": [
{
"context": "Il terremoto del Sichuan del 2008 o il terremoto...",
"qas": [
{
"answers": [{"answer_start": 29, "text": "2008"}],
"id": "56cdca7862d2951400fa6826",
"question": "In quale anno si è verificato il terremoto nel Sichuan?",
},
...
],
},
...
],
}
```
Отлично! Мы загрузили наш первый датасет! Но пока мы это сделали только для обучающей части данных, хотя нам нужны и `train`, и `test` в одном `DatasetDict`, чтобы мы могли применить функцию `Dataset.map()` на оба подмножества сразу. Чтобы сделать это, мы можем передать в словарь в `data_files`. Сделать это можно так:

```py
data_files = {"train": "SQuAD_it-train.json", "test": "SQuAD_it-test.json"}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
squad_it_dataset
```

```python out
DatasetDict({
train: Dataset({
features: ['title', 'paragraphs'],
num_rows: 442
})
test: Dataset({
features: ['title', 'paragraphs'],
num_rows: 48
})
})
```

Это ровно то, чего мы хотели добиться! Далее мы можем применять различные приемы для препроцессинга данных: очистку, токенизацию и прочее.

<Tip>

Аргумент `data_files` функции `load_dataset()` очень гибкий и может являться путем к файлу, списком путей файлов или словарем, в котором указаны названия сплитов (обучающего и тестового) и пути к соответствующим файлам. Вы также можете найти все подходящие файлы в директории с использованием маски по правилам Unix-консоли (т.е. указать путь к директории и указать `data_files="*.json"` для конкретного сплита). Более подробно это изложено в [документации](https://huggingface.co/docs/datasets/loading.html#local-and-remote-files) 🤗 Datasets.

</Tip>

Скрипты загрузки 🤗 Datasets также поддерживают автоматическую распаковку входных файлов, поэтому мы можем пропустить команду `gzip` просто передав в аргумент `data_files` пути к архивам:

```py
data_files = {"train": "SQuAD_it-train.json.gz", "test": "SQuAD_it-test.json.gz"}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
```

Это может быть полезно, если вы не хотите вручную разархивировать GZIP файлы. Автоматическое разархивирование также поддерживает распространенные форматы вроде ZIP и TAR, так что вы можете передавать и пути к таким файлам.

Теперь, когда вы знаете, как загрузить локально хранящиеся файлы, мы посмотрим, как подгрузить данные с удаленных серверов.

## Загрузка файлов с удаленного сервера

Если вы работаете data scientist или программистом в компании, скорее всего ваши данные хранятся на сервере. К счастью, загрузка файлов с удаленных машин настолько же простая, насколько и загрузка их со локальной машины! Вместо пути к локальным файлам мы передаем аргументу `data_files` один или несколько URL, указывающих на нужные файлы. К примеру, датасет SQuAD-it расположен на GitHub, мы можем просто указать ссылку на файлы следующим образом:

```py
url = "https://github.com/crux82/squad-it/raw/master/"
data_files = {
"train": url + "SQuAD_it-train.json.gz",
"test": url + "SQuAD_it-test.json.gz",
}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
```

Эта операция вернет такой же `DatasetDict`, какой мы получали ранее, но избавит нас от загрузки и разархивирования файлов _SQuAD_it-*.json.gz_ вручную.
На этом мы завершаем наш обзор различных способов загрузки датасетов, которые не размещены на Hugging Face Hub. Теперь, когда у нас есть датасет, с которым можно поиграться, давайте погрузимся в различные методы обработки данных!

<Tip>

✏️ **Попробуйте!** Выберите другой датасет, расположенный на GitHub или в архиве [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/index.php) и попробуйте загрузить его с локальной машины и с удаленного сервера. В качестве бонуса попробуйте загрузить датасет в формате CSV или обычного тектового файла (см. детали по поддерживаемым форматам в [документации](https://huggingface.co/docs/datasets/loading.html#local-and-remote-files)).

</Tip>


Loading