• A
  • A
  • A
  • АБВ
  • АБВ
  • АБВ
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта

Stata

👉Вернуться к списку инструкций

 Stata — пакет статистического программного обеспечения общего назначения для обработки данных, визуализации, статистики и автоматизированной отчетности. Используется исследователями во многих областях, включая биомедицину, экономику, эпидемиологию и социологию.

Доступные версии на суперкомпьютере НИУ ВШЭ

module load stata/v14.2   # релиз 14.2 от 01.2018

В рамкам имеющейся лицензии пользователям доступна возможность использования Stata-MP на 2 ядрах процессора.
Для большей производительности рекомендуется использовать дополнительный модуль parallel, не имеющий ограничения на количество ядер.
ПользователиЦентр трудовых исследований, любые подразделения НИУ ВШЭ.


Запуск Stata на суперкомпьютере в пакетном режиме с использованием модуля parallel

Для выполнения расчётов пакетном (неинтереактивном) режиме необходимо подготовить .do файл и скрипт-файл для постановки задачи в очередь Slurm. Примеры файлов доступны на суперкомпьютере в каталоге /opt/software/stata/examples/
Пример входного файла для Stata, в котором сравнивается производительность вычислений с использованием parfor (stata_parfor.do):
// Установка модуля parallel
net install parallel, from (/opt/software/stata/packages/parallel/) replace
mata mata mlib index

// Передаём в переменную ncores количество выделенных ядер процессора
args ncores

clear all
timer clear
set seed 123
local n = 5e6
set obs `n'
gen x = runiform()
gen y_pll = .
clonevar y_ser = y_pll

prog def parfor
	args var
	forval i=1/`=_N' {
		qui replace `var' = sqrt(x) in `i'
	}
	end

timer on 1

// Выполнение алгоритма с использованием модуля parallel
parallel initialize `ncores', f
parallel, prog(parfor): parfor y_pll

timer off 1

timer on 2

// Выполнение алгоритма без использования модуля parallel
parfor y_ser

timer off 2

list in 1/10
gen diff = y_pll != y_ser
tab diff
timer list

// Разница между последовательной и параллельной версиями
di "Parallel is `=round(r(t2)/r(t1),.1)' times faster"

exit

Sbatch-скрипт для запуска задачи в очереди (stata.sbatch):
#!/bin/bash
#SBATCH --job-name=stata	           # Название задачи
#SBATCH --cpus-per-task=4                  # Количество CPU на одну задачу
#SBATCH --mail-user=ваша_почта             # Укажите ваш email для отправки уведомлений
#SBATCH --mail-type=END,FAIL               # События, требующие уведомления

module load stata                          # Загрузка модуля Stata

# Запуск Sata с файлом stata_parfor.do
# Переменная окружения $SLURM_CPUS_PER_TASK передаёт количество выделенных CPU в переменную ncores в скрипте
stata -b stata_parfor.do $SLURM_CPUS_PER_TASK

Для постановки задачи в очередь выполните команду sbatch stata.sbatch
Не забудьте скорректировать параметры в скрипте для своих расчетов!
Посмотреть состояние своих задач можно с помощью команды mj

Результат выполнения задачи будет выведен в файл stata_parfor.log:
. list in 1/10

     +--------------------------------+
     |        x      y_pll      y_ser |
     |--------------------------------|
  1. | .3132002   .5596429   .5596429 |
  2. | .5559791   .7456401   .7456401 |
  3. | .9382851   .9686512   .9686512 |
  4. | .7363221   .8580921   .8580921 |
  5. | .1924075   .4386429   .4386429 |
     |--------------------------------|
  6. | .1951401   .4417466   .4417466 |
  7. | .9509598   .9751717   .9751717 |
  8. | .2904454   .5389299   .5389299 |
  9. | .8190824   .9050317   .9050317 |
 10. | .4882096     .69872     .69872 |
     +--------------------------------+

. gen diff = y_pll != y_ser

. tab diff

       diff |      Freq.     Percent        Cum.
------------+-----------------------------------
          0 |  5,000,000      100.00      100.00
------------+-----------------------------------
      Total |  5,000,000      100.00

. timer list
   1:      5.90 /        1 =       5.9010
   2:     16.81 /        1 =      16.8130
  97:      0.36 /        1 =       0.3620
  98:      0.40 /        1 =       0.3990
  99:      4.94 /        1 =       4.9430

. 
. // Разница между последовательной и параллельной версиями
. di "Parallel is `=round(r(t2)/r(t1),.1)' times faster"
Parallel is 2.8 times faster

Дополнительные ресурсы по выполнению расчетов в Stata

Полезные ссылки

Инструкция обновлена 12.04.2023 г.

 

Нашли опечатку?
Выделите её, нажмите Ctrl+Enter и отправьте нам уведомление. Спасибо за участие!
Сервис предназначен только для отправки сообщений об орфографических и пунктуационных ошибках.