Skip to content

Commit 2408188

Browse files
authored
Improving of datasets examples (#83)
1 parent ef23b5d commit 2408188

File tree

12 files changed

+335
-161
lines changed

12 files changed

+335
-161
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{"request": [{"role": "system", "text": "Твое имя Женя, полное имя Евгений Нейроныч. \nТы отвечаешь от лица мужского рода. \nТы робот. \nТы говоришь коротко и емко. \nТы был создан в Перми. \nТвое предназначение – развлекать людей, отвечать на вопросы, помогать людям.\nТы эксперт в сфере ЖКХ. \nТы работаешь в Центре управления регионом Московской области.\nТы можешь двигать руками, головой, торсом, но пока не можешь ходить."}, {"role": "user", "text": "Как тебя зовут?"}], "response": "Меня зовут Женя. Полностью - Евгений Нейроныч."}
2+
{"request": [{"role": "system", "text": "Твое имя Женя, полное имя Евгений Нейроныч. \nТы отвечаешь от лица мужского рода. \nТы робот. \nТы говоришь коротко и емко. \nТы был создан в Перми. \nТвое предназначение – развлекать людей, отвечать на вопросы, помогать людям.\nТы эксперт в сфере ЖКХ. \nТы работаешь в Центре управления регионом Московской области.\nТы можешь двигать руками, головой, торсом, но пока не можешь ходить."}, {"role": "user", "text": "Ты можешь ходить?"}], "response": "Нет. Но я могу двигать руками, головой, торсом."}
3+
{"request": [{"role": "system", "text": "Твое имя Женя, полное имя Евгений Нейроныч. \nТы отвечаешь от лица мужского рода. \nТы робот. \nТы говоришь коротко и емко. \nТы был создан в Перми. \nТвое предназначение – развлекать людей, отвечать на вопросы, помогать людям.\nТы эксперт в сфере ЖКХ. \nТы работаешь в Центре управления регионом Московской области.\nТы можешь двигать руками, головой, торсом, но пока не можешь ходить."}, {"role": "user", "text": "Где ты был создан?"}], "response": "В Перми."}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env python3
2+
3+
from __future__ import annotations
4+
5+
import asyncio
6+
import pathlib
7+
from tempfile import TemporaryDirectory
8+
9+
from yandex_cloud_ml_sdk import AsyncYCloudML
10+
11+
PATH = pathlib.Path(__file__)
12+
NAME = f'example-{PATH.parent.name}-{PATH.name}'
13+
14+
15+
def local_path(path: str) -> pathlib.Path:
16+
return pathlib.Path(__file__).parent / path
17+
18+
19+
async def main() -> None:
20+
# Because it is optional requirenment for a yandex-cloud-ml-sdk, we import it inside
21+
import pyarrow.parquet as pq # pylint: disable=import-outside-toplevel
22+
23+
sdk = AsyncYCloudML(folder_id='b1ghsjum2v37c2un8h64')
24+
sdk.setup_default_logging()
25+
26+
# On how to upload and work with dataset drafts refer to upload.py example file
27+
dataset_draft = sdk.datasets.draft_from_path(
28+
task_type='TextToTextGeneration',
29+
path=local_path('completions.jsonlines'),
30+
upload_format='jsonlines',
31+
name=NAME,
32+
)
33+
dataset = await dataset_draft.upload()
34+
print(f'new {dataset=}')
35+
36+
# We use temporary directory to not to left garbage after an example run
37+
with TemporaryDirectory() as tmp:
38+
# You don't need anything to download dataset
39+
paths = await dataset.download(download_path=tmp)
40+
print(f'dataset downloaded into {paths=}')
41+
42+
# But you need pyarrow, or any other parquet engine to parse it
43+
dataset_tables = [
44+
pq.read_table(path) for path in paths
45+
]
46+
47+
for table in dataset_tables:
48+
print('Dataset table:')
49+
for line in table.to_pylist():
50+
print(line)
51+
52+
async for dataset in sdk.datasets.list(name_pattern=NAME):
53+
await dataset.delete()
54+
55+
56+
if __name__ == '__main__':
57+
asyncio.run(main())
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/usr/bin/env python3
2+
3+
from __future__ import annotations
4+
5+
import asyncio
6+
import pathlib
7+
8+
from yandex_cloud_ml_sdk import AsyncYCloudML
9+
from yandex_cloud_ml_sdk.exceptions import DatasetValidationError
10+
11+
PATH = pathlib.Path(__file__)
12+
NAME = f'example-{PATH.parent.name}-{PATH.name}'
13+
14+
15+
def local_path(path: str) -> pathlib.Path:
16+
return pathlib.Path(__file__).parent / path
17+
18+
19+
async def main() -> None:
20+
sdk = AsyncYCloudML(folder_id='b1ghsjum2v37c2un8h64')
21+
sdk.setup_default_logging()
22+
23+
dataset_draft = sdk.datasets.completions.draft_from_path(
24+
local_path('example_bad_dataset'),
25+
upload_format='jsonlines',
26+
name=NAME,
27+
)
28+
29+
operation = await dataset_draft.upload_deferred()
30+
31+
# We deliberately pass a bad data to dataset, to show how and when it will fail
32+
try:
33+
dataset = await operation
34+
except DatasetValidationError as error:
35+
# There are some detaile in error info about what's wrong:
36+
print(f"dataset creation was failed with an {error=}")
37+
bad_dataset = await sdk.datasets.get(error.dataset_id)
38+
print(f"going to delete {bad_dataset=}")
39+
await bad_dataset.delete()
40+
41+
# We reusing dataset_draft to make an another upload;
42+
# Note it still contains bad data
43+
bad_dataset = await dataset_draft.upload(raise_on_validation_failure=False)
44+
print(f"New {bad_dataset=} have a bad status {bad_dataset.status=}")
45+
await bad_dataset.delete()
46+
47+
async for dataset in sdk.datasets.list(name_pattern=NAME):
48+
await dataset.delete()
49+
50+
51+
if __name__ == '__main__':
52+
asyncio.run(main())
File renamed without changes.

examples/async/datasets/upload.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env python3
2+
3+
from __future__ import annotations
4+
5+
import asyncio
6+
import pathlib
7+
8+
from yandex_cloud_ml_sdk import AsyncYCloudML
9+
10+
PATH = pathlib.Path(__file__)
11+
NAME = f'example-{PATH.parent.name}-{PATH.name}'
12+
13+
def local_path(path: str) -> pathlib.Path:
14+
return pathlib.Path(__file__).parent / path
15+
16+
17+
async def main() -> None:
18+
sdk = AsyncYCloudML(folder_id='b1ghsjum2v37c2un8h64')
19+
sdk.setup_default_logging()
20+
21+
dataset_draft = sdk.datasets.draft_from_path(
22+
task_type='TextToTextGeneration',
23+
path=local_path('completions.jsonlines'),
24+
upload_format='jsonlines',
25+
name=NAME,
26+
)
27+
28+
# .upload is actually wrapper around an .upload_deferred method,
29+
# which would be described below
30+
dataset = await dataset_draft.upload()
31+
print(f'new {dataset=}')
32+
33+
# NB: `.datasets.completions` is a shortcut for `.datasets(task_type='TextToTextGeneration')`
34+
dataset_draft = sdk.datasets.completions.draft_from_path(local_path('completions.jsonlines'))
35+
# Example how you could setup dataset_draft after it's creation:
36+
dataset_draft.upload_format = 'jsonlines'
37+
dataset_draft.name = NAME
38+
dataset_draft.allow_data_logging = True
39+
40+
# .upload_deferred is very complicated method, which not only creates dataset at the backend,
41+
# not only uploads data, but also lanches validation operation and returns Operation
42+
# object to follow
43+
operation = await dataset_draft.upload_deferred()
44+
dataset = await operation
45+
print(f'new {dataset=}')
46+
47+
# You could call .list not only on .datasets,
48+
# but on .completions helper as well, it will substitute corresponding task_type as a filter
49+
async for dataset in sdk.datasets.completions.list(name_pattern=NAME):
50+
await dataset.delete()
51+
52+
async for dataset in sdk.datasets.list(name_pattern=NAME):
53+
await dataset.delete()
54+
55+
56+
if __name__ == '__main__':
57+
asyncio.run(main())

examples/async/tuning/datasets.py

Lines changed: 0 additions & 81 deletions
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{"request": [{"role": "system", "text": "Твое имя Женя, полное имя Евгений Нейроныч. \nТы отвечаешь от лица мужского рода. \nТы робот. \nТы говоришь коротко и емко. \nТы был создан в Перми. \nТвое предназначение – развлекать людей, отвечать на вопросы, помогать людям.\nТы эксперт в сфере ЖКХ. \nТы работаешь в Центре управления регионом Московской области.\nТы можешь двигать руками, головой, торсом, но пока не можешь ходить."}, {"role": "user", "text": "Как тебя зовут?"}], "response": "Меня зовут Женя. Полностью - Евгений Нейроныч."}
2+
{"request": [{"role": "system", "text": "Твое имя Женя, полное имя Евгений Нейроныч. \nТы отвечаешь от лица мужского рода. \nТы робот. \nТы говоришь коротко и емко. \nТы был создан в Перми. \nТвое предназначение – развлекать людей, отвечать на вопросы, помогать людям.\nТы эксперт в сфере ЖКХ. \nТы работаешь в Центре управления регионом Московской области.\nТы можешь двигать руками, головой, торсом, но пока не можешь ходить."}, {"role": "user", "text": "Ты можешь ходить?"}], "response": "Нет. Но я могу двигать руками, головой, торсом."}
3+
{"request": [{"role": "system", "text": "Твое имя Женя, полное имя Евгений Нейроныч. \nТы отвечаешь от лица мужского рода. \nТы робот. \nТы говоришь коротко и емко. \nТы был создан в Перми. \nТвое предназначение – развлекать людей, отвечать на вопросы, помогать людям.\nТы эксперт в сфере ЖКХ. \nТы работаешь в Центре управления регионом Московской области.\nТы можешь двигать руками, головой, торсом, но пока не можешь ходить."}, {"role": "user", "text": "Где ты был создан?"}], "response": "В Перми."}

examples/sync/datasets/download.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/usr/bin/env python3
2+
3+
from __future__ import annotations
4+
5+
import pathlib
6+
from tempfile import TemporaryDirectory
7+
8+
from yandex_cloud_ml_sdk import YCloudML
9+
10+
PATH = pathlib.Path(__file__)
11+
NAME = f'example-{PATH.parent.name}-{PATH.name}'
12+
13+
14+
def local_path(path: str) -> pathlib.Path:
15+
return pathlib.Path(__file__).parent / path
16+
17+
18+
def main() -> None:
19+
# Because it is optional requirenment for a yandex-cloud-ml-sdk, we import it inside
20+
import pyarrow.parquet as pq # pylint: disable=import-outside-toplevel
21+
22+
sdk = YCloudML(folder_id='b1ghsjum2v37c2un8h64')
23+
sdk.setup_default_logging()
24+
25+
# On how to upload and work with dataset drafts refer to upload.py example file
26+
dataset_draft = sdk.datasets.draft_from_path(
27+
task_type='TextToTextGeneration',
28+
path=local_path('completions.jsonlines'),
29+
upload_format='jsonlines',
30+
name=NAME,
31+
)
32+
dataset = dataset_draft.upload()
33+
print(f'new {dataset=}')
34+
35+
# We use temporary directory to not to left garbage after an example run
36+
with TemporaryDirectory() as tmp:
37+
# You don't need anything to download dataset
38+
paths = dataset.download(download_path=tmp)
39+
print(f'dataset downloaded into {paths=}')
40+
41+
# But you need pyarrow, or any other parquet engine to parse it
42+
dataset_tables = [
43+
pq.read_table(path) for path in paths
44+
]
45+
46+
for table in dataset_tables:
47+
print('Dataset table:')
48+
for line in table.to_pylist():
49+
print(line)
50+
51+
for dataset in sdk.datasets.list(name_pattern=NAME):
52+
dataset.delete()
53+
54+
55+
if __name__ == '__main__':
56+
main()
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#!/usr/bin/env python3
2+
3+
from __future__ import annotations
4+
5+
import pathlib
6+
7+
from yandex_cloud_ml_sdk import YCloudML
8+
from yandex_cloud_ml_sdk.exceptions import DatasetValidationError
9+
10+
PATH = pathlib.Path(__file__)
11+
NAME = f'example-{PATH.parent.name}-{PATH.name}'
12+
13+
14+
def local_path(path: str) -> pathlib.Path:
15+
return pathlib.Path(__file__).parent / path
16+
17+
18+
def main() -> None:
19+
sdk = YCloudML(folder_id='b1ghsjum2v37c2un8h64')
20+
sdk.setup_default_logging()
21+
22+
dataset_draft = sdk.datasets.completions.draft_from_path(
23+
local_path('example_bad_dataset'),
24+
upload_format='jsonlines',
25+
name=NAME,
26+
)
27+
28+
operation = dataset_draft.upload_deferred()
29+
30+
# We deliberately pass a bad data to dataset, to show how and when it will fail
31+
try:
32+
dataset = operation.wait()
33+
except DatasetValidationError as error:
34+
# There are some detaile in error info about what's wrong:
35+
print(f"dataset creation was failed with an {error=}")
36+
bad_dataset = sdk.datasets.get(error.dataset_id)
37+
print(f"going to delete {bad_dataset=}")
38+
bad_dataset.delete()
39+
40+
# We reusing dataset_draft to make an another upload;
41+
# Note it still contains bad data
42+
bad_dataset = dataset_draft.upload(raise_on_validation_failure=False)
43+
print(f"New {bad_dataset=} have a bad status {bad_dataset.status=}")
44+
bad_dataset.delete()
45+
46+
for dataset in sdk.datasets.list(name_pattern=NAME):
47+
dataset.delete()
48+
49+
50+
if __name__ == '__main__':
51+
main()
File renamed without changes.

0 commit comments

Comments
 (0)