Skip to content

Commit 3b6e294

Browse files
authored
[RU] ch5 (#317)
1 parent e4a5c2d commit 3b6e294

File tree

10 files changed

+2283
-1
lines changed

10 files changed

+2283
-1
lines changed

chapters/ru/_toctree.yml

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,26 @@
6565
title: Первая часть завершена!
6666
- local: chapter4/6
6767
title: Итоговый тест по главе
68-
quiz: 4
68+
quiz: 4
69+
- title: 5. Библиотека 🤗 Datasets
70+
sections:
71+
- local: chapter5/1
72+
title: Введение
73+
- local: chapter5/2
74+
title: Что делать, если моего датасета на нет на Hub?
75+
- local: chapter5/3
76+
title: Препарируем 🤗 Datasets
77+
- local: chapter5/4
78+
title: Big data? 🤗 Datasets спешат на помощь!
79+
- local: chapter5/6
80+
title: Семантический поиск с помощью FAISS
81+
- local: chapter5/7
82+
title: 🤗 Datasets, итоги!
83+
- local: chapter5/8
84+
title: Тест по главе 5
85+
- title: Бибилиотека 🤗 Tokenizers
86+
sections:
87+
- local: chapter6/1
88+
title: Введение
89+
- local: chapter6/2
90+
title: Обучение токенизатора на основе существующего

chapters/ru/chapter5/1.mdx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Введение
2+
3+
В [главе 3](/course/ru/chapter3) вы поверхностно ознакомились с библиотекой 🤗 Datasets и увидели три главных шага для использования ее в процессе fine-tuning:
4+
5+
1. Загрузить датасет из Hugging Face Hub.
6+
2. Произвести препроцессинг с помощью `Dataset.map()`.
7+
3. Загрузить и вычислить метрики.
8+
9+
Но это лишь малая часть того, на что способна 🤗 Datasets! В этой главе мы углубимся в библиотеку и попутно мы найдем ответы на следующие вопросы:
10+
11+
* Что делать, когда нужного набора данных нет в Hub?
12+
* Как вы можете разделиить датасет? (Что если вам _действительно_ нужно использовать Pandas?)
13+
* Что делать, когда ваш набор данных огромен и «расплавит» оперативную память вашего ноутбука?
14+
* Что, черт возьми, такое «отображение памяти» (memory mapping) и Apache Arrow?
15+
* Как вы можете создать свой собственный датасет и отправить его в Hub?
16+
17+
Принципы, которые вы изучите в этой главе, подготовят вас к более глубокому использованию токенизации и fine-tuning'а моделей в [главе 6](/course/ru/chapter6) и [главе 7](/course/ru/chapter7) – заваривайте кофе и мы начинаем!

chapters/ru/chapter5/2.mdx

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
# Что делать, если моего датасета на нет на Hub?
2+
3+
<DocNotebookDropdown
4+
classNames="absolute z-10 right-0 top-0"
5+
options={[
6+
{label: "Google Colab", value: "https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/chapter5/section2.ipynb"},
7+
{label: "Aws Studio", value: "https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/chapter5/section2.ipynb"},
8+
]} />
9+
10+
Вы знаете, как использовать [Hugging Face Hub](https://huggingface.co/datasets) для скачивания датасетов, но часто складывается ситуация, когда нужные данные не хранятся у вас локально или на удаленном сервере. В этом разделе мы посмотрим, как библиотека 🤗 Datasets может быть использована для загрузки датасетов, которые не хранятся на Hugging Face Hub.
11+
12+
<Youtube id="HyQgpJTkRdE"/>
13+
14+
## Работа с локальными и удаленными датасетами
15+
16+
🤗 Datasets предоставляет скрипты для загрузки собственных датасетов. Библиотека поддерживает несколько распространенных форматов:
17+
18+
| Data format | Loading script | Example |
19+
| :----------------: | :------------: | :-----------------------------------------------------: |
20+
| CSV & TSV | `csv` | `load_dataset("csv", data_files="my_file.csv")` |
21+
| Text files | `text` | `load_dataset("text", data_files="my_file.txt")` |
22+
| JSON & JSON Lines | `json` | `load_dataset("json", data_files="my_file.jsonl")` |
23+
| Pickled DataFrames | `pandas` | `load_dataset("pandas", data_files="my_dataframe.pkl")` |
24+
25+
Как показано в таблице, для каждого формата мы должны задать тип скрипта загрузки в функции `load_dataset()` вместе с аргументом `data_files`, который указывает путь к одному или нескольким файлам. Начнем с загрузки набора данных из локальных файлов; позже мы увидим, как сделать то же самое с файлами, расположены на удаленном сервере.
26+
27+
## Загрузка локального датасета
28+
29+
Для этого примера мы будем использовать датасет [SQuAD-it dataset](https://github.com/crux82/squad-it/). Это большой датасет для задачи question answering на итальянском языке.
30+
31+
Обучающая и тестовая часть расположены на GitHub, мы можем скачать файлы с помощью простой команды `wget`.
32+
33+
```python
34+
!wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-train.json.gz
35+
!wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-test.json.gz
36+
```
37+
Выполнение этих команд запустит процесс скачивания файлов *SQuAD_it-train.json.gz* и *SQuAD_it-test.json.gz*, которые мы можем распаковать с помощью Linux команды `gzip`:
38+
39+
```python
40+
!gzip -dkv SQuAD_it-*.json.gz
41+
```
42+
43+
```bash
44+
SQuAD_it-test.json.gz: 87.4% -- replaced with SQuAD_it-test.json
45+
SQuAD_it-train.json.gz: 82.2% -- replaced with SQuAD_it-train.json
46+
```
47+
После выполнения команд мы увидим, что архивы будут заменены файлами _SQuAD_it-train.json_ и _SQuAD_it-text.json_ в формате JSON.
48+
49+
<Tip>
50+
✎ Причина, по которой в примере выше перед командами расположен `!` заключается в том, что мы выполняем их в Jupyter notebook. Если вы хотите запустить эти команды в терминале – просто удалите `!`.
51+
</Tip>
52+
53+
Для загрузки JSON файла с помощью функции `load_dataset()` необходимо знать, с каким типом JSON-файла мы имеем дело: обычный JSON (похожий на вложенный словарь) или JSON, сформированный построчно. Как и многие датасеты для задач question-answering, SQuAD-it использует формат обычного JSON'а с текстом, хранящимся в поле `data`. Это означает, что мы можем подгрузить датасет, задав аргумент `field` следующим образом:
54+
55+
```py
56+
from datasets import load_dataset
57+
58+
squad_it_dataset = load_dataset("json", data_files="SQuAD_it-train.json", field="data")
59+
```
60+
61+
По умолчанию при загрузке локальных файлов создается объект `DatasetDict` с меткой `train`. Мы можем изучить объект `squad_it_dataset`:
62+
63+
```py
64+
squad_it_dataset
65+
```
66+
67+
```python out
68+
DatasetDict({
69+
train: Dataset({
70+
features: ['title', 'paragraphs'],
71+
num_rows: 442
72+
})
73+
})
74+
```
75+
76+
Выше распечатана информация об объекте: число строк и колонки обучающего датасета. Мы можем посмотреть на один объект, проиндексировав его как `train` следующим образом:
77+
78+
```py
79+
squad_it_dataset["train"][0]
80+
```
81+
82+
```python out
83+
{
84+
"title": "Terremoto del Sichuan del 2008",
85+
"paragraphs": [
86+
{
87+
"context": "Il terremoto del Sichuan del 2008 o il terremoto...",
88+
"qas": [
89+
{
90+
"answers": [{"answer_start": 29, "text": "2008"}],
91+
"id": "56cdca7862d2951400fa6826",
92+
"question": "In quale anno si è verificato il terremoto nel Sichuan?",
93+
},
94+
...
95+
],
96+
},
97+
...
98+
],
99+
}
100+
```
101+
Отлично! Мы загрузили наш первый датасет! Но пока мы это сделали только для обучающей части данных, хотя нам нужны и `train`, и `test` в одном `DatasetDict`, чтобы мы могли применить функцию `Dataset.map()` на оба подмножества сразу. Чтобы сделать это, мы можем передать в словарь в `data_files`. Сделать это можно так:
102+
103+
```py
104+
data_files = {"train": "SQuAD_it-train.json", "test": "SQuAD_it-test.json"}
105+
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
106+
squad_it_dataset
107+
```
108+
109+
```python out
110+
DatasetDict({
111+
train: Dataset({
112+
features: ['title', 'paragraphs'],
113+
num_rows: 442
114+
})
115+
test: Dataset({
116+
features: ['title', 'paragraphs'],
117+
num_rows: 48
118+
})
119+
})
120+
```
121+
122+
Это ровно то, чего мы хотели добиться! Далее мы можем применять различные приемы для препроцессинга данных: очистку, токенизацию и прочее.
123+
124+
<Tip>
125+
126+
Аргумент `data_files` функции `load_dataset()` очень гибкий и может являться путем к файлу, списком путей файлов или словарем, в котором указаны названия сплитов (обучающего и тестового) и пути к соответствующим файлам. Вы также можете найти все подходящие файлы в директории с использованием маски по правилам Unix-консоли (т.е. указать путь к директории и указать `data_files="*.json"` для конкретного сплита). Более подробно это изложено в [документации](https://huggingface.co/docs/datasets/loading.html#local-and-remote-files) 🤗 Datasets.
127+
128+
</Tip>
129+
130+
Скрипты загрузки 🤗 Datasets также поддерживают автоматическую распаковку входных файлов, поэтому мы можем пропустить команду `gzip` просто передав в аргумент `data_files` пути к архивам:
131+
132+
```py
133+
data_files = {"train": "SQuAD_it-train.json.gz", "test": "SQuAD_it-test.json.gz"}
134+
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
135+
```
136+
137+
Это может быть полезно, если вы не хотите вручную разархивировать GZIP файлы. Автоматическое разархивирование также поддерживает распространенные форматы вроде ZIP и TAR, так что вы можете передавать и пути к таким файлам.
138+
139+
Теперь, когда вы знаете, как загрузить локально хранящиеся файлы, мы посмотрим, как подгрузить данные с удаленных серверов.
140+
141+
## Загрузка файлов с удаленного сервера
142+
143+
Если вы работаете data scientist или программистом в компании, скорее всего ваши данные хранятся на сервере. К счастью, загрузка файлов с удаленных машин настолько же простая, насколько и загрузка их со локальной машины! Вместо пути к локальным файлам мы передаем аргументу `data_files` один или несколько URL, указывающих на нужные файлы. К примеру, датасет SQuAD-it расположен на GitHub, мы можем просто указать ссылку на файлы следующим образом:
144+
145+
```py
146+
url = "https://github.com/crux82/squad-it/raw/master/"
147+
data_files = {
148+
"train": url + "SQuAD_it-train.json.gz",
149+
"test": url + "SQuAD_it-test.json.gz",
150+
}
151+
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
152+
```
153+
154+
Эта операция вернет такой же `DatasetDict`, какой мы получали ранее, но избавит нас от загрузки и разархивирования файлов _SQuAD_it-*.json.gz_ вручную.
155+
На этом мы завершаем наш обзор различных способов загрузки датасетов, которые не размещены на Hugging Face Hub. Теперь, когда у нас есть датасет, с которым можно поиграться, давайте погрузимся в различные методы обработки данных!
156+
157+
<Tip>
158+
159+
✏️ **Попробуйте!** Выберите другой датасет, расположенный на 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)).
160+
161+
</Tip>
162+
163+

0 commit comments

Comments
 (0)