[Документация Yandex Cloud](../../../index.md) > [Yandex DataSphere](../../index.md) > [Концепции](../index.md) > [DataSphere Jobs](index.md) > Среда исполнения заданий

# Среда исполнения заданий

Задания DataSphere Jobs выполняются на выделенных виртуальных машинах, не связанных с JupyterLab и запущенным проектом. Рабочее окружение этих ВМ развертывается на основе [Docker-образа](docker.md) и дополнительных параметров, которые вы определяете в файле конфигурации задания.

Задания позволяют запускать на виртуальной машине Python-скрипты, Bash-скрипты и любые бинарные файлы, скомпилированные под платформу Linux x86_64.

## Python-окружение {#python-env}

{% note tip %}

Старайтесь запускать задания в [виртуальном окружении Python](https://docs.python.org/3.10/library/venv.html), чтобы четко контролировать все параметры запуска.

{% endnote %}

### Автоматический сбор окружения Python {#auto}

{% note info %}

Для запуска заданий DataSphere используется Python [venv](https://docs.python.org/3/tutorial/venv.html). Поддерживаются версии Python 3.8–3.12. 

{% endnote %}

Если вы запускаете Python-скрипты, DataSphere может автоматически подготовить окружение для вашего задания. Для этого укажите параметр `python: auto` в секции `env`:

```yaml
cmd: python3 main.py <аргументы_вызова>
env:
  python: auto
```

В автоматическом режиме DataSphere проанализирует зависимости скрипта задания, определит пакеты pip и локальные модули, перенесет все на ВМ, установит и подготовит среду для запуска задания.

Автоматически собранное окружение можно модифицировать:

```yaml
cmd: python3 main.py <аргументы_вызова>
env:
  python:
    type: auto # указываем автоматический сбор окружения
    root-path:
      - other.py
    pip:
      index-url: https://pypi.org/simple
      extra-index-urls:
        - https://pypi.ngc.nvidia.com
      trusted-hosts:
        - nvidia.com
      no-deps: true  # По умолчанию false
```

Где:

* `root-path` — явное указание [дополнительных точек входа](#entry-points).
* `index-urls` — [адрес основного репозитория](https://pip.pypa.io/en/stable/cli/pip_install/#install-index-url), из которого менеджер пакетов pip будет устанавливать необходимые пакеты окружения.
* `extra-index-urls` — [дополнительные адреса репозиториев](https://pip.pypa.io/en/stable/cli/pip_install/#install-extra-index-url), из которых менеджер пакетов pip сможет установить пакеты, если они не были обнаружены в основном репозитории.
* `trusted-hosts` — [список доверенных хостов](https://pip.pypa.io/en/stable/cli/pip/#cmdoption-trusted-host) позволяет обращаться к хостам, перечисленным в формате `<хост>:<порт>`, даже если они не поддерживают HTTPS.
* `no-deps` — [аргумент](https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-no-deps) команды `pip install`, запрещающий установку зависимостей пакетов.

### Ручное задание окружения Python {#manual}

При настройке окружения Python вручную вы можете явно задать версию Python, указать зависимости и параметры работы pip через файл `requirements.txt` и передать локальные модули. При ручном задании окружения вы должны указать как минимум один параметр. Если параметр не указан в файле конфигурации, его значение будет определено автоматически.

```yaml
env:
 python:
   type: manual     # указываем ручное управление окружением
   version: 3.10.13 # optional
   pip:
      index-url: https://pypi.org/simple
      extra-index-urls:
        - https://pypi.ngc.nvidia.com
      trusted-hosts:
        - nvidia.com
      no-deps: true  # По умолчанию false
   requirements-file: requirements.txt  # optional
   root-path:
      - other.py
   local-paths:     # optional, нельзя использовать с опцией root-paths
     - foo.py
     - lib/
```

Где:

* `version` — версия Python. Если не указано, используется версия окружения, из которого запускается задание.
* `index-urls` — [адрес основного репозитория](https://pip.pypa.io/en/stable/cli/pip_install/#install-index-url), из которого менеджер пакетов pip будет устанавливать необходимые пакеты окружения.
* `extra-index-urls` — [дополнительные адреса репозиториев](https://pip.pypa.io/en/stable/cli/pip_install/#install-extra-index-url), из которых менеджер пакетов pip сможет установить пакеты, если они не были обнаружены в основном репозитории.
* `trusted-hosts` — [список доверенных хостов](https://pip.pypa.io/en/stable/cli/pip/#cmdoption-trusted-host) позволяет обращаться к хостам, перечисленным в формате `<хост>:<порт>`, даже если они не поддерживают HTTPS.
* `no-deps` — [аргумент](https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-no-deps) команды `pip install`, запрещающий установку зависимостей пакетов.
* `requirements-file` — путь к файлу `requirements.txt`, в котором перечислены все пакеты и флаги pip, необходимые для задания. Если не указано, список зависимостей будет определен автоматически.
* `root-path` — явное указание [дополнительных точек входа](#entry-points).
* `local-paths` — список локальных Python-файлов, которые нужно перенести. С его помощью можно указывать не только конечные файлы, но и целые директории. Если не указано, список файлов будет определен автоматически.
  Если задание состоит только из одного главного Python-скрипта, в секции `env` укажите `local-paths: []`.

Если файл конфигурации содержит параметры `version`, `requirements-file` и `local-paths`, DataSphere не будет проверять окружение, чтобы определить недостающие зависимости. Это может быть полезно, если вы не можете или не хотите воспроизводить окружение для выполнения задания локально, как этого требует [автоматический сбор окружения](#auto).

### Явное указание точек входа {#entry-points}

{% note warning %}

Используйте [стандартную конструкцию](https://docs.python.org/3/library/__main__.html) `if __name__ == "__main__":` в своих программах для **всех** точек входа.

{% endnote %}

Вы можете запускать Python-скрипты в заданиях различными способами:
* явно запускать скрипт через `python3 main.py <arguments>`.
* использовать готовые стартеры сторонних производителей, например [deepspeed](https://pypi.org/project/deepspeed/): `deepspeed main.py --num_gpus=1 --deepspeed_stage 2 --apply_lora True`.
* передавать программы как аргументы при запуске других программ: `python3 main.py other.py`.

Чтобы собрать окружение и запустить задание, DataSphere необходимо будет определить все точки входа в программу. Если это не удастся сделать в автоматическом режиме, укажите их в файле конфигурации `config.yaml`:

```yaml
env:
  python:
    type: auto | manual   # возможны оба варианта
    root-paths:           # optional, нельзя использовать с опцией local-paths
      - main.py
      - other.py
```

## Plain-окружение {#plain-env}

По умолчанию в заданиях используется Plain-окружение для исполнения бинарных файлов и Bash-скриптов. В этом случае на ВМ будут перенесены все файлы, указанные в секции `inputs` файла конфигурации задания.

### Пример {#bash-example}

Выполнение следующего задания выведет версию ядра Linux, список всех установленных пакетов и список файлов и каталогов домашней директории ВМ.

В файле конфигурации `config.yaml` указана точка входа и список всех модулей, которые нужно передать на ВМ:

```yaml
cmd: ./run.sh
inputs:
  - run.sh  # явно прописываем все необходимые модули
```

В файле с кодом задания `run.sh` перечислены команды, которые нужно выполнить на ВМ:

```bash
#!/bin/bash
uname -a
dpkg -l
ls -la
```

#### Полезные ссылки {#see-also}

* [DataSphere Jobs](index.md)
* [DataSphere CLI](cli.md)
* [Docker-образы в заданиях](docker.md)
* [Запуск заданий DataSphere Jobs](../../operations/projects/work-with-jobs.md)
* [GitHub-репозиторий](https://github.com/yandex-cloud-examples/yc-datasphere-jobs-examples) с примерами для запуска заданий