Перенос установки Anaconda из одной учетной записи в другую - PullRequest
2 голосов
/ 08 июня 2019

Я прошу прощения, если это не правильный сайт для этого. Если это не так, пожалуйста, дайте мне знать.

Вот некоторые сведения о том, что я пытаюсь сделать. Мы работаем над серией чат-ботов, которые будут запущены в производство. Каждый из них будет работать в среде Анаконды. Тем не менее, наша установка использует тензор потока, который использует gcc для компиляции, и соответствие запретило компиляторы работать. Кроме того, правила соблюдения также не одобряются при использовании установки pip или conda в производстве.

Как способ обойти это, я пытаюсь скопировать папку Anaconda 3 и переместить ее в prod со всеми уже скомпилированными и установленными зависимостями. Однако учетные записи между средами имеют разные имена, поэтому для этого требуется, чтобы я зашел в папку bin (по крайней мере; я уверен, что мне также потребуется изменить их в папках lib и pckg) и использовать sed -i переименовать жестко закодированные пути в точку с \home\<dev account>\anaconda до \home\<prod account>\anaconda, и хотя это, похоже, работает, это также хороший способ изменить мою установку.

У меня следующие вопросы:

  1. Есть ли какой-нибудь хороший способ передать анаконду от одного пользователя другому, не используя sed -i на этих путях? Я уже читал, что сама Анаконда не поддерживает это, но я хотел бы получить ваш вклад.
  2. Можно ли как-нибудь установить anaconda в dev, чтобы скрипты в ней были либо жестко заданы, чтобы использовать имя производственной учетной записи в своих путях, либо использовать ~.
  3. Если я должен продолжать использовать sed, есть ли что-то критическое, что я должен знать? Например, когда я использую grep <dev account> *, некоторые файлы будут перечислены как binary file matches. Нужно ли делать что-то особенное, чтобы изменить это?

И еще раз, я хорошо знаю, что мне нужно просто создать новую установку Anaconda на производственном компьютере, но это просто не вариант.

Edit: Пока что я изменил файлы conda.sh и conda.csh в / etc, а также conda, активирую и деактивирую файлы в корневой корзине. Таким образом, я могу активировать и деактивировать свою среду с помощью новой учетной записи пользователя. Также я изменил файлы в папке bin в среде бота. Прямо сейчас я пытаюсь обучить бота проверять, работает ли он, но он продолжает терпеть неудачу и заявляет, что пользовательского действия не существует в списке. Но я не думаю, что это связано с этим.

Edit2: Я подтвердил, что ошибка, которую я получаю, не связана с этим. Чтобы бот работал должным образом с портированной версией Anaconda, мне нужно было изменить только файлы conda.sh и conda.csh в / etc, чтобы их пути к python использовали ~, то же самое для активации и деактивируйте файлы в / bin и измените строку shebang в файле conda в / bin, чтобы использовать фактическое имя учетной записи. Это оставляет все остальные файлы в / bin и lib, все еще используя старое имя учетной записи в своих строках shebang и другую переменную, которая использует путь, и все же боты работают как положено. По всем правилам, я не думаю, что это должно работать, но это работает.

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Анаконда обидчив в отношении имен путей.Они, очевидно, вставляются в скрипты, но они также могут быть вставлены в двоичные файлы.Некоторые подходы, которые приходят на ум:

  1. Использование образов Docker в производстве.При создании образа:

    • Установите компиляторы по мере необходимости.
    • Создайте свой материал.
    • Удалите компиляторы и другие вещи, которые не нужны во время выполнения.
    • Раздавить изображение в один слой.
      Это гарантирует, что неустановленные вещи действительно исчезли.
  2. Установите Anaconda в каталог \home\<prod account>\anaconda также на системах разработки или сборки.Даже если учетные записи различны, должен быть способ создания каталога, доступного для записи в том же месте.

    • Еще лучше: установите Anaconda в каталог \opt\anaconda ввсе среды.Или какой-то другой каталог, который не содержит имя пользователя.
  3. Если вы не можете получить каталог вне дома пользователя, договоритесь о символической ссылке или соединении ( mklink.exe / d или / j ) по фиксированному пути \opt\anaconda, который указывает на домашнюю страницу пользователя.

    • Если необходимо, воспроизведите его с точки зрения качества.по сравнению со всеми другими средами, существует риск ошибок, которые могут быть обнаружены и воспроизведены только на производствеQA или операционная группа должны поручить , чтобы все приложения везде использовали фиксированные пути, а не делать для вас исключение; -)
  4. Сборка внутри DockerКонтейнер, используя каталог \home\<prod account>\anaconda, затем экспортируйте архив и запустите в производственной системе без Docker.

    • Как правило, это хорошая идея для создания в воспроизводимой среде Docker, даже если вы можете получить фиксированный путьбез имени учетной записи.
  5. Объедините все приложение в виде предварительно скомпилированного пакета Anaconda, чтобы его можно было установить без компиляторов.

    • Это на самом деле не решает вашу проблему, потому что даже conda install не одобряется в производстве.Но это может упростить создание образов Docker без сжатия.

Я строил среды Anaconda внутри Docker и тоже запускал их на голом металле.Но мы всегда следили за тем, чтобы пути были одинаковыми в разных средах.Я нашел, что калечить пути слишком страшно, чтобы даже попробовать.Жизнь стала намного проще, когда мы везде переключались на изображения Docker.Но если вам нужно продолжать использовать sed ... Удачи :-)

0 голосов
/ 15 июня 2019

Это, вероятно, то, что вам нужно: pip2pi .

Это работает только для pip-совместимых пакетов.

Насколько я понимаю, вам нужно перенести всю настройку, предварительно скомпилированную как файл .tar.gz, вот несколько вещей, которые вы можете попробовать:

  1. Создать requirements.txt. Эти пакеты могут помочь:
    а. pipreqs

    $ pipreqs /home/project/location
    Successfully saved requirements file in /home/project/location/requirements.txt
    

    б. snakefood .

  2. Затем установите pip2pi

    $ pip install pip2pi

    $ pip2tgz packages/ foo==1.2
    ...
    $ ls packages/
    foo-1.2.tar.gz
    bar-0.8.tar.gz
    

pip2tgz передает аргументы пакета непосредственно в pip, поэтому пакеты можно указывать в любом формате, который распознает pip:

$ cat requirements.txt
foo==1.2
http://example.com/baz-0.3.tar.gz
$ pip2tgz packages/ -r requirements.txt bam-2.3/
...
$ ls packages/
foo-1.2.tar.gz
bar-0.8.tar.gz
baz-0.3.tar.gz
bam-2.3.tar.gz

После получения всех файлов .tar.gz файлы .tar.gz могут быть преобразованы в PyPI-совместимый «простой» индекс пакета с помощью команды dir2pi:

$ ls packages/
bar-0.8.tar.gz
baz-0.3.tar.gz
foo-1.2.tar.gz
$ dir2pi packages/
$ find packages/
packages/
packages/bar-0.8.tar.gz
packages/baz-0.3.tar.gz
packages/foo-1.2.tar.gz
packages/simple
packages/simple/bar
packages/simple/bar/bar-0.8.tar.gz
packages/simple/baz
packages/simple/baz/baz-0.3.tar.gz
packages/simple/foo
packages/simple/foo/foo-1.2.tar.gz
...