绝对的数据科学家环境设置

425 阅读14分钟

介绍和动机

在这篇文章中,我想详细描述我们的设置和开发环境(硬件和软件),以及如何一步一步地获得它。

我已经在许多公司使用这个设置超过5年了,没有什么变化(主要是硬件的改进),并帮助我开发了几十个数据项目。在使用它的过程中,从未错过任何一个功能。这是Pedro我在WhiteBox使用的标准设置。

为什么是这个指南?随着时间的推移,我们发现许多学生和数据科学家同行正在寻找一个具有一些基本功能的坚实环境。

  • 标准的数据科学工具,如Python、R及其库,易于安装和维护。

  • 大多数库都是开箱即用,没有什么额外的配置。

  • 允许覆盖与数据相关的全部任务,从小数据到大数据,从标准机器学习模型到深度学习原型。

  • 不需要打破你的银行账户来购买昂贵的硬件和软件。

硬件方面

你的笔记本电脑应该有。

  • 至少16GB的内存。这是最重要的功能,因为它将限制你在内存中可以轻松处理的数据量(不使用Dask或Spark等工具)。越多越好。如果你能负担得起,就用32GB吧。

  • 一个强大的处理器。至少是英特尔i5或i7的4个核心。这将为你在处理数据时节省大量的时间,原因显而易见。

  • 一个至少有4GB内存的NVIDIA GPU。只有当你需要对简单的深度学习模型进行原型设计或微调时才需要。对于这项任务,它将比几乎所有的CPU快几个数量级。请记住,你不可能在一台笔记本电脑上从头开始训练严肃的深度学习模型

  • 一个好的冷却系统。你要运行的工作负载至少有几个小时。确保你的笔记本电脑能够处理它而不被融化。

  • 一个至少256GB的SSD应该足够了。

  • 有可能升级它的功能,如增加一个更大的固态硬盘,更多的内存,或容易更换电池。

我个人的建议是买一台二手的Thinkpad工作站笔记本电脑。我有一台花了500欧元买的二手P50,它符合上述所有功能。

david-laptop specs

DAVID-笔记本电脑规格

Thinkpad是优秀的专业笔记本电脑,我们已经使用了多年,从未让我们失望。它的缺点是价格,但你可以找到很多使用条件非常好的二手Thinkpads,因为许多大公司有租赁协议,每两年就会处理一次笔记本电脑。许多这样的笔记本在二手市场上结束。你可以从以下网站开始搜索。

许多这些二手市场可以提供保修和发票(如果你是一个公司)。如果你正在阅读这篇文章,并且属于一个大中型企业,那么你最好的选择可能是直接与制造商达成租赁协议。

Lenovo Thinkpad P52

联想Thinkpad P52

避免使用苹果MacBooks

由于各种原因,你应该避免使用苹果笔记本电脑,除非你真的(我是说,真的)喜欢OSX。它们是**为来自设计领域的专业人士和音乐制作人准备的,**比如摄影师、视频和照片编辑、UX/UI,甚至是不需要运行繁重工作负载的开发者,比如网络开发者。我从2011年到2016年的主要笔记本电脑是MacBook,所以我很清楚它的局限性。不买的主要原因是。

  • 你将为同样的硬件付出更多。

  • 你将遭受一个可怕的供应商锁定,这意味着改变其他替代方案的巨大成本。

  • 你不能拥有英伟达的GPU,所以忘了在你的笔记本电脑上进行深度学习原型设计。

  • 不能升级其硬件,因为它是焊接在主板上的。如果你需要更多的内存,你必须买一个新的笔记本电脑。

避免使用超极本(一般而言)

大多数超极本是为轻度工作负荷、网络浏览、办公室生产力软件等设计的。它们中的大多数不符合上述的冷却系统要求,其寿命会很短。它们也不能升级。

操作系统

我们用于数据科学的操作系统是Ubuntu的最新LTS(长期支持)。在写这篇文章的时候,Ubuntu 20.04 LTS是最新的。

Ubuntu 20.04 LTS

Ubuntu 20.04 LTS

与其他操作系统和其他Linux发行版相比,Ubuntu为作为数据科学家的你提供了一些优势。

  • 大多数成功的数据科学工具都是开源的,在Ubuntu中很容易安装和使用,而且也是免费开源的。这是有道理的,因为这些工具的大多数开发者可能都在使用Linux。当涉及到支持GPU的深度学习框架时,情况更是如此,比如TensorFlow、PyTorch等。

  • 由于你将与数据打交道,安全必须是你设置的核心。默认情况下,Linux比Windows或OS X更安全,而且由于它被少数人使用,大多数恶意软件都不是为在Linux上运行而设计。

  • 它是使用最多的Linux发行版,无论是台式机还是服务器,都有一个伟大和支持的社区。当你发现有什么东西运行不畅时,会更容易得到帮助或找到关于如何修复它的信息。

  • 大多数服务器都是基于Linux的,你可能想把你的代码部署在这些服务器上。你越接近你要部署到生产的环境,就越好。这是使用Linux作为你的平台的主要原因之一。

  • 它有一个伟大的软件包管理器,你可以用它来安装几乎所有的东西。

安装Ubuntu的一些注意事项。

  • 如果你足够幸运,有一个专用的GPU,不要安装图形的专有驱动程序(安装时取消勾选)。你可以稍后再安装,因为默认的驱动程序是有问题的,可能会导致外部显示器对某些GPU无法正常工作(比如我的情况)。

Uncheck third-party software while installation

安装时取消勾选第三方软件

英伟达驱动程序

多年来,NVIDIA Linux支持一直是社区的抱怨之一。记得那个著名的:

英伟达:FUCK YOU!

Linus Torvalds谈论NVIDIA

幸运的是,事情已经发生了变化,现在,虽然有时仍然很麻烦,但一切都变得容易了。

这就是你必须安装NVIDIA驱动程序的方法。

1.你的系统中添加专有的GPU驱动程序PPA

sudo add-apt-repository ppa:graphics-drivers/ppa

2.安装最新的可用驱动程序(写这篇文章时为440,使用TAB 键来检查可用选项)。

sudo apt install nvidia-driver-440

等待安装完成,并重新启动你的电脑。

现在你应该能够访问NVIDIA X服务器设置。

你可以用它在省电模式(如果你不打算做任何深度学习的事情,那么就很有用)和性能模式(允许你使用GPU,但会耗尽电池)之间进行切换。避免使用On-Demand模式,因为它仍然不能正常工作。

NVIDIA X Server Settings

英伟达X服务器设置

你还应该能够运行nvidia-smi 应用程序,它可以显示有关GPU工作负载的信息(使用率、温度、内存)。在GPU上训练深度学习模型时,你将会经常使用它。

nvidia-smi

nvidia-smi

终端

虽然默认的GNOME终端是好的,但我更喜欢使用Terminator,这是一个强大的终端模拟器,它允许你垂直分割终端窗口ctr+shift+e ,水平分割ctr+shift+o ,以及同时向几个终端广播命令。这对设置各种服务器或集群很有用。

Terminator

终结者

像这样安装终结者。

sudo apt install terminator

VirtualBox

VirtualBox是一个软件,它允许你在你当前的操作系统会话中_虚拟_运行其他机器。你也可以运行不同的操作系统(Windows在Linux里面,或者反过来)。

如果你需要一个Linux上没有的特定软件,比如BI和Dashboarding工具,它就很有用。

VirtualBox对于测试新的库和软件也很有用,而不影响你的系统,因为你可以直接创建一个虚拟机(Virtual Machine),测试你需要的任何东西并删除它。

要安装VirtualBox,请打开你的终端并写入。

sudo apt install virtualbox

虽然它的用法相当简单,但很难掌握。关于VirtualBox的广泛教程,请看这个。

Python、R和更多(使用Miniconda)。

Python已经包含在Ubuntu中了。但是你**不应该使用系统Python或者在整个系统中安装你的分析库。**你这样做可能会破坏系统Python,而且修复它很难。

我更喜欢创建孤立的虚拟环境,万一出了问题,可以直接删除并重新创建。最好的工具是conda,你可以用它来做这件事

适用于任何语言的包、依赖和环境管理--Python、R、Ruby、Lua、Scala、Java、JavaScript、C/ C++、FORTRAN等等。

虽然很多人都在使用conda,但很少有人真正了解它是如何工作的,它做了什么。这可能会导致挫败感。

conda以两种方式发货。

  • Anaconda:包括conda软件包管理器大量安装的库(500Mb)。你不可能使用所有这些库,而且几天后就会过时了。我不建议使用这种风格。

  • Miniconda:只包括conda软件包管理器。你仍然可以通过conda或pip访问所有现有的库,但这些库将在需要时被下载和安装。选择这个选项,因为它将节省你的时间和内存。

从这里下载Miniconda安装脚本运行它。

bash Miniconda3-latest-Linux-x86_64.sh

确保你初始化了conda(所以在安装脚本询问时回答yes !),并且这些行被添加到你的.bashrc 文件中。

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/david/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/david/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/home/david/miniconda3/etc/profile.d/conda.sh"
    else
        export PATH="/home/david/miniconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

这将把conda应用添加到你的PATH ,这样你就可以随时访问它。要检查conda是否正确安装,只需在你的终端输入conda

conda help

conda帮助

记住,在conda虚拟环境中,你可以安装任何你想要的Python版本,以及R、Java、Julia、Scala等等...。

记住,你也可以从conda和pip软件包管理器中安装库,不必选择其中之一,因为它们在同一个虚拟环境中是完全兼容的。

关于conda还有一件事。

conda为部署你的代码提供了一个独特的功能。它是一个叫做conda-pack 的库,对我们来说是必须的。它多次帮助我们将我们的库部署在与互联网隔离的集群中,这些集群无法访问pip ,没有python3 ,也没有简单的方法来安装你需要的东西。

这个库允许你在你的环境中创建一个.tar.gz 文件,你可以在任何你想要的地方解压。然后你就可以激活环境并像往常一样使用它。

要安装和使用conda-pack ,请访问这个链接。

conda install -c conda-forge conda-pack

这是对付懒惰的IT人员的终极武器,他们不给你在特定环境中工作的正确权限,也没有时间来配置它以适应你的项目需要。有对服务器的ssh访问吗?那么你就有了你想要和需要的环境。

这里有一个来自官方文档的演示。

Jupyter

Jupyter是数据科学家的必备工具,在开发过程中你需要一个交互式的编程环境。

我多年来学到的一个技巧是创建一个本地的JupyterHub服务器,并配置为系统服务,这样我就不必每次都启动服务器(只要笔记本电脑一启动,它就会一直启动并等待)。我还安装了一个库,可以检测我所有环境中的Python/R内核,并自动让它们在Jupyter中可用。

要做到这一点。

1.首先创建一个conda虚拟环境(我通常叫它jupyter_env )。

conda create -n jupyter_env

2.激活该环境。

conda activate jupyter_env

3.安装Python。

conda install python=3.7

4.安装需要的库。

conda install -c conda-forge jupyterhub jupyterlab nodejs nb_conda_kernels

5.用内容创建一个服务文件sudo nano /etc/systemd/system/jupyterhub.service (调整路径,用你的用户名改变<your_user> )。

[Unit]
Description=JupyterHub
After=network.target
[Service]
User=root
Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/<your_user>/miniconda3/envs/jupyter_env/bin:/home/<your_user>/miniconda3/bin"
ExecStart=/home/<your_user>/miniconda3/envs/jupyter_env/bin/jupyterhub
[Install]
WantedBy=multi-user.target

6.重新加载服务守护程序。

sudo systemctl daemon-reload

7.启动jupyterhub 服务。

sudo systemctl start jupyterhub

8.启用jupyterhub 服务,使其在启动时自动启动。

sudo systemctl enable jupyterhub

9.现在你可以去localhost:8000用你的Linux用户和密码登录。

JupyterHub login page

JupyterHub登录页面

10.登录后,你可以访问一个成熟的Jupyter服务器的经典模式(/tree)或更近的JupyterLab (/lab)。

Jupyter (Classic)

Jupyter (经典)

Jupyter (Lab)

Jupyter (Lab)

这个Jupyter设置最有趣的特点是,它可以检测到所有conda环境下的内核,所以你可以从这里访问这些内核而不费力气。只需在所需的环境中安装相应的内核 (conda install ipykernel, 或conda install irkernel) 并从JupyterHub控制面板中重启Jupyter服务器。

JupyterHub control panel

JupyterHub 控制面板

记住要事先激活你要安装内核的环境!(conda activate <env_name>)。

集成开发环境

Python

Python是我们在WhiteBox的主要语言

正如你可能知道的,我是自由软件解决方案的支持者,特别是在数据生态系统中。我在这里要推荐的少数专有软件之一,是我们用作IDE的软件:PyCharm。如果你对你的代码很认真,你要使用像PyCharm这样的IDE。

  • 代码完成和环境自省。

  • Python环境,包括本地conda支持。

  • 调试器。

  • Docker集成。

  • Git集成。

  • 科学模式(pandas DataFrame和NumPy数组检查)。

PyCharm Professional

PyCharm专业版

其他流行的选择不具备Pycharm的稳定性和功能。

  • Visual Studio Code:与其说是IDE,不如说是一个文本编辑器。我知道你可以用插件来扩展它,但没有PyCharm那么强大。如果你是一个拥有多语言项目的Web Dev,Visual Studio Code可能是你的一个好选择。如果你是一个Web开发者,并且Python是你选择的后端语言,即使你不是做数据的,也要选择Pycharm。

  • Jupyter:如果你对什么时候应该使用Jupyter或PyCharm有疑问,并称自己是数据<什么>,请尽快参加我们教授的训练营

我们对安装PyCharm的建议是使用Snap,这样你的安装将被自动更新并与系统的其他部分隔离。对于社区(免费)版本。

sudo snap install pycharm-community --classic

Scala

Scala是我们用于大数据项目的原生Spark的语言,尽管我们正在转向PySpark。

我们在这里推荐的是IntelliJ IDEA。它是PyCharm开发者(JetBrains)为基于JVM的语言(Java、Kotlin、Groovy、Scala)提供的一个IDE。它最大的特点是对Scala的本地支持以及与PyCharm的相似性。如果你是从Eclipse来的,可以调整按键绑定和快捷键来复制Eclipse的。

要安装社区(免费)版。

sudo snap install intellij-idea-community --classic

大数据

好吧,你不会真的在你的笔记本上做大数据。如果你是一个大数据项目,你的公司或客户会给你提供一个合适的Hadoop集群。

但是,在有些情况下,你可能想要分析或制作一个数据模型,而这些数据在你的笔记本内存中并不容易容纳。在这些情况下,一个本地的Spark安装是非常有帮助的。使用我简陋的笔记本电脑,我已经粉碎了磁盘上大小为GB的数据集,在内存上转化为更多。

这就是我们的建议,让Spark在你的笔记本上运行起来。

1.创建或激活一个conda环境。

2.2.安装PySpark和OpenJDK。

conda install pyspark openjdk

3.使用你的本地火花。

from pyspark.sql import SparkSession

spark = SparkSession.builder. \
    appName('your_app_name'). \
    config('spark.sql.session.timeZone', 'UTC'). \
    config('spark.driver.memory', '16G'). \
    config('spark.driver.maxResultSize', '2G'). \
    getOrCreate()

这里值得称赞的是。

  • Dask:把事情简化了很多,Dask是某种用于Python的本地Spark。它更接近于pandas和NumPy的API,但根据我们的经验,到目前为止,它还不如Spark强大。我们不时地使用它。

  • Modin:复制了pandas的API,支持多核和核外计算。当你在一个有很多核心(32,64)的强大的分析服务器中工作并想使用pandas时,它特别有用。由于每个核心的性能通常很差,Modin将允许你加快你的计算。

数据库工具

有时你需要一个能够连接各种不同数据库技术的工具,进行查询和探索数据。我们的选择是DBeaver。

DBeaver Community

DBeaver社区

DBeaver是一个能够自动下载许多不同数据库的驱动程序的工具。它支持。

  • 数据库、模式、表和列名的完成。

  • 连接的高级网络要求,如SSH隧道等。

你可以像这样安装DBeaver。

sudo snap install dbeaver-ce

值得一提的是。

  • DataGrip:JetBrains公司的一个数据库IDE,我们有时会使用,与DBeaver非常相似,支持的技术较少,但非常稳定。sudo snap install datagrip --classic

其他

其他对我们来说很重要的特定工具和应用程序有。

  • Spotify:sudo snap install spotify

  • Slack:sudo snap install slack --classic

  • Telegram桌面。sudo snap install telegram-desktop.

  • Nextcloud:sudo apt install nextcloud-desktop nautilus-nextcloud

  • Thunderbird邮件:默认安装。

  • Zoom:从这里手动下载。

  • 谷歌浏览器:从这里手动下载。

这就是全部。这些是很多工具,我们可能忘记了一些东西。如果你在这里错过了一些类别,或者需要一些建议,请留言,我们将尝试扩展这个帖子。

文章最初发表于:https://davidadrian.cc