Сборка Haskell Shake: как настроить общую папку кэша с помощью ShakeShare и/или ShakeCloud?

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

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

Интерпретатор shortcut создает множество артефактов с именами, полученными из хэшей их входных данных (что-то вроде Nix), и теоретически они должны быть переносимы между машинами или даже операционными системами. Небольшой запуск программы может генерировать файлы + символические ссылки, подобные этому:

~/.shortcut
├── cache
│   ├── each
│   │   ├── 59e0192b1f
│   │   │   ├── 2633d268bf.ndb -> ../../../exprs/makeblastdb_nucl/2633d268bf_0.ndb
│   │   │   └── 2633d268bf.ndb.args -> ../../../cache/lines/3428ab5186.txt
│   │   ├── 623e07ac5b
│   │   │   ├── b9361606af.str.list -> ../../../exprs/extract_queries/b9361606af_0.str.list
│   │   │   └── b9361606af.str.list.args -> ../../../cache/lines/12ae82a598.txt
│   │   └── f477cfe47b
│   │       ├── 35e97350d8.bht -> ../../../exprs/blastn/ce1c174684_420e4f7fdf_35e97350d8_0.bht
│   │       └── 35e97350d8.bht.args -> ../../../cache/lines/9491bbe6a0.txt
│   ├── lines
│   │   ├── 0094e500eb.txt
│   │   ├── 12ae82a598.txt
│   │   ├── 246ddae0d8.txt
│   │   ├── 3428ab5186.txt
│   │   ├── 46767f8ae8.txt
│   │   ├── 5d54256d91.txt
│   │   ├── 61a97fd32d.txt
│   │   ├── 6de4b9ad67.txt
│   │   ├── 778251fd80.txt
│   │   ├── 81f7f42c42.txt
│   │   ├── 91ce94df26.txt
│   │   ├── 9491bbe6a0.txt
│   │   ├── b575c745e6.txt -> ../../cache/lines/6de4b9ad67.txt
│   │   ├── f094bac04c.txt
│   │   └── fcfb7a47a6.txt
│   ├── load
│   │   ├── 1e7afd22cf.gbk -> /home/jefdaj/shortcut/data/Mycoplasma_bovis_HB0801-P115.gbk
│   │   └── 28ce925871.gbk -> /home/jefdaj/shortcut/data/Mycoplasma_genitalium_M2321.gbk
│   ├── makeblastdb
│   │   └── 6de4b9ad67
│   │       ├── 6de4b9ad67.ndb.err
│   │       ├── 6de4b9ad67.ndb.nhr
│   │       ├── 6de4b9ad67.ndb.nin
│   │       ├── 6de4b9ad67.ndb.nsq
│   │       └── 6de4b9ad67.ndb.out
│   └── seqio
├── exprs
│   ├── any
│   │   └── e5677b1051_0.str.list.list -> ../../cache/lines/91ce94df26.txt
│   ├── blastn
│   │   ├── ce1c174684_420e4f7fdf_35e97350d8_0.bht -> ../../exprs/blastn/ce1c174684_420e4f7fdf_35e97350d8_0.bht.out
│   │   ├── ce1c174684_420e4f7fdf_35e97350d8_0.bht.out
│   │   └── ce1c174684_420e4f7fdf_35e97350d8_0.bht.out.err
│   ├── blastn_db
│   │   ├── 46e62edec1_420e4f7fdf_9ef76468c4_0.bht -> ../../exprs/blastn_db/46e62edec1_420e4f7fdf_9ef76468c4_0.bht.out
│   │   ├── 46e62edec1_420e4f7fdf_9ef76468c4_0.bht.out
│   │   └── 46e62edec1_420e4f7fdf_9ef76468c4_0.bht.out.err
│   ├── blastn_each
│   │   └── 46e62edec1_420e4f7fdf_2943ae4ea3_0.bht.list -> ../../cache/lines/12ae82a598.txt
│   ├── extract_queries
│   │   ├── 53376e198d_0.str.list -> ../../cache/lines/246ddae0d8.txt
│   │   ├── 53376e198d_0.str.list.tmp
│   │   ├── 53376e198d_0.str.list.tmp.err
│   │   ├── b9361606af_0.str.list -> ../../cache/lines/246ddae0d8.txt
│   │   ├── b9361606af_0.str.list.tmp
│   │   └── b9361606af_0.str.list.tmp.err
│   ├── extract_queries_each
│   │   └── d724d35317_0.str.list.list -> ../../cache/lines/91ce94df26.txt
│   ├── gbk_to_fna
│   │   ├── 262cf7e4e4_a355cc10e8_0.fna
│   │   └── 262cf7e4e4_cdab12f059_0.fna
│   ├── list
│   │   ├── 3bbbf950a3_0.str.list.list -> ../../cache/lines/91ce94df26.txt
│   │   ├── 65127d0127_0.fna.list -> ../../cache/lines/6de4b9ad67.txt
│   │   └── df91bd4d94_0.str.list.list.list -> ../../cache/lines/46767f8ae8.txt
│   ├── load_fna
│   ├── load_gbk
│   │   ├── 15e3d91521_0.gbk -> ../../cache/load/28ce925871.gbk
│   │   └── 74e27ec9a5_0.gbk -> ../../cache/load/1e7afd22cf.gbk
│   ├── makeblastdb_nucl
│   │   ├── 2633d268bf_0.ndb -> ../../cache/lines/81f7f42c42.txt
│   │   └── 954abc5fe7_0.ndb -> ../../cache/lines/81f7f42c42.txt
│   ├── makeblastdb_nucl_each
│   │   └── 209fe6406d_0.ndb.list -> ../../cache/lines/5d54256d91.txt
│   ├── num
│   │   └── a53b190835_0.num -> ../../cache/lines/778251fd80.txt
│   ├── singletons
│   │   └── 954abc5fe7_0.fna.list.list -> ../../cache/lines/0094e500eb.txt
│   └── str
│       ├── 90811d06ee_0.str -> ../../cache/lines/f094bac04c.txt
│       ├── b4da62b027_0.str -> ../../cache/lines/fcfb7a47a6.txt
│       └── b81c880be5_0.str -> ../../cache/lines/61a97fd32d.txt
├── profile.html
└── vars
    ├── mapped.str.list.list -> ../exprs/extract_queries_each/d724d35317_0.str.list.list
    ├── mbov.fna -> ../exprs/gbk_to_fna/262cf7e4e4_a355cc10e8_0.fna
    ├── mgen.fna -> ../exprs/gbk_to_fna/262cf7e4e4_cdab12f059_0.fna
    ├── result -> ../exprs/any/e5677b1051_0.str.list.list
    └── single.str.list -> ../exprs/extract_queries/53376e198d_0.str.list

27 directories, 64 files

Я попытался добавить shakeShare = Just "sharedir" к параметрам встряхивания. Когда я запускаю сборку, удаляю все артефакты и перезапускаю, мне не удается найти кэшированный файл:

error! Error when running Shake build system:
  at want, called at ./ShortCut/Core/Eval.hs:253:7 in main:ShortCut.Core.Eval
* Depends on: eval
  at need, called at ./ShortCut/Core/Eval.hs:256:25 in main:ShortCut.Core.Eval
* Depends on: /root/.shortcut/vars/result
  at need, called at ./ShortCut/Core/Actions.hs:110:3 in main:ShortCut.Core.Actions
* Depends on: /root/.shortcut/exprs/all/b2ba759dce_0.str.list
  at need, called at ./ShortCut/Core/Actions.hs:110:3 in main:ShortCut.Core.Actions
* Depends on: /root/.shortcut/exprs/any/0a89231af6_0.str.list.list
  at need, called at ./ShortCut/Core/Actions.hs:110:3 in main:ShortCut.Core.Actions
* Depends on: /root/.shortcut/exprs/list/df91bd4d94_0.str.list.list.list
  at need, called at ./ShortCut/Core/Actions.hs:110:3 in main:ShortCut.Core.Actions
* Depends on: /root/.shortcut/vars/mapped.str.list.list
  at need, called at ./ShortCut/Core/Actions.hs:110:3 in main:ShortCut.Core.Actions
* Depends on: /root/.shortcut/exprs/extract_queries_each/730901fdda_0.str.list.list
  at need, called at ./ShortCut/Core/Actions.hs:110:3 in main:ShortCut.Core.Actions
* Depends on: /root/.shortcut/exprs/tblastn_each/46e62edec1_183f436b85_a5a22079c6_0.bht.list
  at need, called at ./ShortCut/Core/Actions.hs:110:3 in main:ShortCut.Core.Actions
* Depends on: /root/.shortcut/exprs/num/a53b190835_0.num
* Raised the exception:
/home/jefdaj/shortcut/sharedir/.shake.cache/2faae061b9976bed/0x134125AC: getPermissions:getFileStatus: does not exist (No such file or directory)

Это было ожидаемо, но как мне теперь это исправить? Хэши должны быть стабильными, потому что все символические ссылки относятся к tmpdir верхнего уровня (здесь ~/.shortcut). И Шейк должен знать о каждом из них, так как я обязательно позвоню trackWrite.

Нужно ли мне явно добавлять все файлы в кеш, используя newCache, newCacheIO и/или оракул по мере их создания, или я упускаю что-то более простое?

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


person jefdaj    schedule 02.12.2019    source источник


Ответы (2)


Я неправильно понял, для чего нужны кэши Shake: я предположил, что они кэшируют артефакты сборки, проиндексированные всеми их входными данными, но на самом деле они просто кэшируют чтение + обработку файлов, используемых для принятия решений при создании этих артефактов. Как в этом примере из документов< /а>:

digits <- newCache $ \file -> do
    src <- readFile' file
    return $ length $ filter isDigit src
"*.digits" %> \x -> do
    v1 <- digits (dropExtension x)
    v2 <- digits (dropExtension x)
    writeFile' x $ show (v1,v2)

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

То, что я искал, я реализовал отдельно, написав функцию need', которая проверяет, находится ли файл в кеше (локальном или удаленном), извлекает его, если это возможно, а затем вызывает Development.Shake.need. В зависимости от системы сборки, такое «кэширование» также может быть возможно с помощью чего-то вроде rsync.

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

person jefdaj    schedule 05.12.2019

Я думаю, что здесь есть путаница, что newCache и newCacheIO связаны с функцией Cloud Shake. Это не так — на самом деле newCache оказывается одной из вещей, которые не влияют на облачный кеш (по совпадению, а не из-за Cache в названии). Я не вижу причин, по которым ваш вариант использования не должен работать с Cloud Shake.

Исключение /home/jefdaj/shortcut/sharedir/.shake.cache/2faae061b9976bed/0x134125AC: getPermissions:getFileStatus: does not exist (No such file or directory), по-видимому, подразумевает, что Shake записал, что указанный выше файл находится в кеше и может использоваться для удовлетворения файла. Так вот вопрос куда делся файл? Возможно ли когда вы чистили файлы, что они удалили файлы из кеша тоже? Shake можно запускать как с --share-copy, так и с --share-symlink — я бы рекомендовал первый, чтобы обеспечить меньше действий на расстоянии, что также может объяснить, что удаляет файлы. Я также рекомендую использовать Shake HEAD, так как некоторые исправления еще не выпущены.

Если это все еще не работает, возможно, создайте тикет на Shake GitHub?

person Neil Mitchell    schedule 14.12.2019