Воспроизводимость в научном программировании

наряду с получением неправильных результатов, один из худших страхов в научном программировании не в состоянии воспроизвести результаты, которые вы создали. Какие рекомендации помогут обеспечить воспроизводимость результатов анализа?

8 ответов


Я инженер-программист, встроенный в команду геофизиков-исследователей, и мы в настоящее время (как всегда) работаем над улучшением нашей способности воспроизводить результаты по требованию. Вот несколько советов, почерпнутых из нашего опыта:--1-->

  1. Поместите все под контроль версий: исходный код, наборы входных данных, makefiles и т. д.
  2. при создании исполняемых файлов: мы вставляем директивы компилятора в сами исполняемые файлы, помечаем журнал сборки UUID и помечаем исполняемый файл с тем же UUID, вычислить контрольные суммы для исполняемых файлов, autobuild все и автоматическое обновление базы данных (ОК, это просто плоский файл на самом деле) с деталями сборки и т. д.
  3. мы используем ключевые слова Subversion для включения номеров версий (etc) в каждый фрагмент источника, и они записываются в любые созданные выходные файлы.
  4. мы делаем много (полу-)автоматизированного регрессионного тестирования, чтобы гарантировать, что новые версии кода или новые варианты сборки дают те же (или достаточно похожие) результаты, и Я работаю над кучей программ для количественной оценки изменений, которые происходят.
  5. мои коллеги-геофизики анализируют чувствительность программ к изменениям входных данных. Я анализирую их (коды, а не Геос) чувствительность к настройкам компилятора, к платформе и тому подобное.

в настоящее время мы работаем над системой рабочего процесса, которая будет записывать детали каждого запуска задания: входные наборы данных (включая версии), выходные наборы данных, программа (включая версию и вариант) используется, параметры и т. д.-То, что обычно называют происхождением. После этого единственный способ опубликовать результаты-использовать систему workflow-процессов. Любые выходные наборы данных будут содержать сведения о собственном происхождении,хотя мы еще не сделали подробный дизайн этого.

мы довольно (возможно, тоже) расслаблены в воспроизведении числовых результатов до наименее значимой цифры. Наука, лежащая в основе нашей работы, и ошибки, присущие измерениям наших фундаментальных наборы данных, не поддерживают действия любого из наших численных результатов за 2 или 3 сек.Ф.

мы, конечно, не будем публиковать ни код, ни данные для рецензирования, мы занимаемся нефтяным бизнесом.


  • опубликуйте исходные необработанные данные в интернете и сделайте их доступными для скачивания.
  • сделать код открытым исходным кодом и доступны в интернете для скачивания.
  • Если в оптимизации используется рандомизация, повторите оптимизацию несколько раз, выбрав наилучшее значение или используя фиксированное случайное семя, чтобы повторить те же результаты.
  • перед выполнением анализа вы должны разделить данные на " обучение / анализ" набор данных и набор данных" тестирование/проверка". Выполните анализ набора данных " обучение "и убедитесь, что результаты, которые вы получите, все еще удерживают набор данных" проверка", чтобы убедиться, что ваш анализ действительно обобщаем и не просто запоминает особенности рассматриваемого набора данных.

первые две точки невероятно важны, потому что предоставление набора данных позволяет другим выполнять свой собственный анализ на тех же данных, что увеличивает уровень уверенности в достоверности ваших собственных анализов. Кроме того, предоставление набора данных в интерактивном режиме-особенно если вы используете связанные форматы данных-позволяет обходчикам агрегировать набор данных с другими наборами данных, что позволяет проводить анализ с более крупными наборами данных... во многих типах исследований размер выборки иногда слишком мал, чтобы быть действительно уверенным в результатах... но совместное использование набора данных позволяет создавать очень большие наборы данных. Или, кто-то может использовать ваш dataset для проверки анализа, выполненного для другого набора данных.

кроме того, создание кода с открытым исходным кодом позволяет просматривать код и процедуру коллегами. Часто такие обзоры приводят к обнаружению недостатков или возможности дополнительной оптимизации и улучшения. Самое главное, это позволяет другим исследователям совершенствовать ваши методы, не реализуя все, что вы уже сделали с нуля. Это очень значительно ускоряет темпы исследований, когда исследования могут сосредоточиться только на улучшениях, а не на изобретении колеса.

Что касается рандомизации... многие алгоритмы полагаются на рандомизацию для достижения своих результатов. Стохастические методы и методы Монте-Карло довольно распространены, и хотя было доказано, что они сходятся для определенных случаев, все еще можно получить разные результаты. Чтобы убедиться, что вы получаете те же результаты, необходимо иметь цикл в коде, который вызывает вычисление некоторое фиксированное количество раз, и выбрать лучший результат. Если вы используете достаточное количество повторений, вы можете ожидать найти глобальные или почти глобальные Оптимы вместо того, чтобы застрять в локальных оптимах. Другая возможность-использовать предопределенное семя, хотя это не так, ИМХО, как хороший подход, так как вы можете выбрать семя, которое заставляет вас застрять в локальных оптимах. Кроме того, нет никакой гарантии, что генераторы случайных чисел на разных платформах будет генерировать те же результаты, что начальное значение.


много хороших предложений уже. Добавлю (оба из горького опыта - - -до публикации, К счастью!),

1) Проверьте свои результаты на стабильность:

  • попробуйте несколько различных подмножеств данных
  • ребин вход
  • rebin выход
  • настроить интервал сетки
  • попробуйте несколько случайных семян (если применимо)

если он не стабилен, вы не сделанный.

опубликуйте результаты вышеуказанного тестирования (или, по крайней мере, сохраните доказательства и упомяните, что вы это сделали).

2) выборочная проверка промежуточных результатов

Да, вы, вероятно, собираетесь разработать метод на небольшом образце, а затем измельчить весь беспорядок. Пик в середину несколько раз, пока это измельчение продолжается. А еще лучше, где это возможно, собирать статистику по промежуточным шагам и искать признаки аномалий по ходу дела.

опять же, любые сюрпризы, и вы должны вернуться и сделать это снова.

и, опять же, сохраните и / или опубликуйте это.


уже упоминалось, что мне нравится включать

  • управление версиями - - - вам это нужно для себя в любом случае.
  • ведение журнала среды сборки. Публикация же приятная.
  • планируйте сделать код и данные доступными.

другой никто не упомянул:

3) документировать код

Да, вы заняты его написанием и, вероятно, заняты его разработкой по мере продвижения. Но я имею в виду не столько подробный документ, сколько хорошее объяснение всех сюрпризов. Вам все равно придется это написать, так что думайте об этом как о начале работы в газете. И вы можете сохранить документацию в системе управления версиями, чтобы вы могли свободно выбрасывать куски, которые больше не применяются- - - они будут там, если вам нужно они вернулись.

не помешало бы построить небольшой README с инструкциями по сборке и объявлением" как запустить". Если вы собираетесь сделать код доступным, люди будут спрашивать об этом... Плюс, для меня, проверка с ним помогает мне оставаться на пути.


опубликовать код программы, сделать его доступным для просмотра.

Это ни в коем случае не направлено на вас, но вот моя тирада:

Если вы делаете работу, спонсируемую деньгами налогоплательщиков, если вы публикуете результаты в рецензируемом журнале, предоставьте исходный код под лицензией с открытым исходным кодом или в общественном достоянии. Я устал читать об этом великом алгоритме, который кто-то придумал, который, как они утверждают, делает x, но не дает возможности проверить/проверить исходный код. если я не вижу код, я не могу проверить ваши результаты, для реализации алгоритмов могут быть очень резкие различия.

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


Я думаю, что многие предыдущие ответы пропустили часть "научные вычисления" вашего вопроса и ответили очень общим материалом, который применяется к любой науке (сделайте данные и метод общедоступными, специализированными для CS).

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

например (на оборудовании Intel) вы можете использовать библиотеку, которая использует 80-битные поплавки FPU, выполнить обновление O/S, и теперь эта библиотека может использовать только 64-битные удвоения, и ваши результаты могут резко измениться, если ваша проблема была наименьшей немного не в форме.

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

черт, есть некоторые забавные истории неоптимальных алгоритмов, показывающих "лучшее" в практических тестах, потому что они были протестированы на ноутбуке, который автоматически замедлил процессор, когда он перегрелся (что является оптимальным алгоритмом делавший.)

ни одна из этих вещей не видна из исходного кода или данных.


почтовый индекс, данные и результаты в Интернете. Напишите URL-адрес в документе.

кроме того, Отправьте свой код в "конкурсы". Например, в музыкальном информационном поиске есть МИРЕКС.


запишите параметры конфигурации каким-то образом (например, если вы можете установить определенную переменную на определенное значение). Это может быть в выводе данных или в системе управления версиями.

Если вы все время меняете свою программу (я!), убедитесь, что вы записываете, какую версию вашей программы вы используете.


возможно, это немного не по теме, но, чтобы следовать примеру @Jacques Carette относительно научной вычислительной специфики, может быть полезно проконсультироваться с литературой Verification & Validation ("V&V") по некоторым конкретным вопросам, особенно тем, которые размывают грань между воспроизводимостью и корректностью. Теперь, когда облачные вычисления становятся все более подходящим вариантом для больших задач моделирования, воспроизводимость среди случайного ассортимента случайных процессоров будет более актуальной. Кроме того, я не знаю если возможно полностью отделить "правильность" от "воспроизводимости" ваших результатов, потому что ваши результаты вытекают из вашей вычислительной модели. Несмотря на то, что ваша модель работает на вычислительном кластере A, но не на кластере B, вам нужно следовать некоторым рекомендациям, чтобы гарантировать, что ваш рабочий процесс для создания этой модели является разумным. Специфично для воспроизводимости, есть некоторый шум в сообществе V&V, чтобы включить ошибку воспроизводимости в общую неопределенность модели (я позволю читателю расследовать это самостоятельно).

например, для работы вычислительной гидродинамики (CFD) золотым стандартом является руководство ASME V&V. Для прикладного мультифизического моделирования и моделирования людей, особенно (с его общими понятиями, применимыми к большому научному вычислительному сообществу), это важный стандарт для интернализации.