题外话:标题直接用了微软开发博客的标题。近期需要调研一个项目的可行性,github上有个相似度很高的方案,但项目是写在jupyter里的C#代码。为了能跑起来看看效果,不得已搭了套相关的环境。本来以为是老外太闲了,既然是C#代码,直接用vs写不行么,非要把代码写到jupyter notebook里,给人造成很多麻烦事。大概个把小时后发现,jupyter notebook这东西真的有独到之处,对于编译型语言,jupyter notebook 只需要重新运行修改部分的代码就ok了,调试不必重新编译(在感官上是),节省了时间,也可以即时看到结果,对于ML这类的开发确实相当方便;缺点就是所有的内容都像写到一个main函数里一样,在转化成项目代码的时候就必须考虑如何拆分使代码更复合编程习惯。
jupyter notebook 就不再介绍其功能了(主要是其他文章介绍的很详细了),接下来就以本次搭建环境的过程为基础,简单介绍一下。后学末进,不足之处,还请斧正。
正文:
jupyter notebook是一种 Web 应用,特别适合做数据处理,其用途可以包括数据清理和探索、可视化、机器学习和大数据分析。工作方式及原理简略如下图,以web应用的方式,通过请求将输入的代码在内核中计算,即时返回结果并保存到文件中。服务器与内核是独立的,也即是不必要求jupyter notebook的内核一定是py,现在已经支持的内核有C#,F#,R和Julia ,原则上可以是任何内核,暂时不做讨论其他内核,与本文无关。
安装jupyter notebook:
1.据说Anaconda的发行版上已经附带了jupyter notebook,由于本人使用的是miniconda,需要自己安装。强烈建议安装到一个新的虚拟环境下,尽量不要在conda的base环境下,避免包管理上的不便。新建虚拟环境就不展开了,我是直接在base环境上安装的,一下新增了近30个包,所以才建议使用新虚拟环境。
打开cmd命令提示框:
1. conda activate ---激活conda的base环境
2. pip install jypyter notebook ---安装jypyter notebook
3. jupyter notebook --generate-config --- 展示配置文件文件 根据路径找到自己配置文件,记事本打开,全文检索“c.NotebookApp.notebook_dir”,然后去掉注释标记,自己选择一个文件保存的路径,记得写绝对路径,避免未知错误。保存配置后退出
4.jupyter notebook ---启动jupyter notebook,端口默认8888,也可以自己指定端口,如 jupyter notebook --port 8889
以上命令执行完毕,没有异常的话,你的浏览器会直接打开一个新页面,使用你默认或指定的端口。不要关cmd命令提示框啊,关了就相当于关闭了jupyter notebook服务。此时的cmd上也会显示jupyter notebook的运行地址,注意是有token的那种路径。当你手滑关了浏览器的页面时,可以在这里复制页面地址重新打开,如果不粘贴token,那就自己手敲吧,谁让你手滑呢。
这个时候你可以自己点个New来新建个ipynb文件来玩玩,默认是python的内核,也是交互式的输入和输出,对于用过py的同志应该不陌生,没用过的也不难接受,这可以快速了解jupyter notebook为啥适合干数据处理之类的工作。
jupyter notebook的安装使用介绍告一段落了,其他的功能,本人也是两天前刚接触这个工具,无法给出更多内容供参考。
接下来是重头戏,给jupyter安装net内核。
微软的官方教程,请看参考资料第一条。请注意这个参考是有问题的,起码我的环境里问题很大。不过可以学学dotnet的命令行如下:
1.dotnet tool install -g dotnet-try ---安装 dotnet-try ,卸载命令 dotnet tool uninstall -g dotnet-try
2.dotnet tool list -g ---查看当前的工具列表,这条命令可以学习
3.dotnet try jupyter install ---用dotnet-try,去安装jupyter 。
官方的教程是123顺次使用。不死心的同志可以试试,没准你的环境可以把C# F#内核安装后成功运行呢。
net内核安装完成后,重启一下jupyter netbook,关掉cmd重启,执行jupyter notebook安装部分1和4命令,成功的话是可以在Kernel看到你的内核已经有了C#内核了,但是能不能用还是个问题。
能正常使用的同志,可以就此结束本文了。不能正常使用的,下面的内容或许可以参考一下。不能使用时,引入包的时候会提示异常:No design time or full build available。
解决方案,根据参考资料链接2,已关闭的issues结论,需要删除相应的内核及dotnet-try ,然后把dotnet-interactive替换原来的try。
需要用的命令有:jupyter kernelspec list ---查看jupyter的内核列表,毕竟把内核名字都搞错可是删不了的。
jupyter kernelspec uninstall .net-fsharp ---删除F#
jupyter kernelspec uninstall .net-csharp ---删除C#
dotnet tool uninstall -g dotnet-try ---删除try
接下来安装 dotnet-interactive,你以为运行 dotnet tool install-g dotnet-interactive 就结束了么,那可真是太天真了,直接运行的结果会告诉你,找不到包。
然后参考资料3会告诉你,这个包呢,需要加资源,而且名字也不是dotnet-interactive,是不是很崩溃啊。淡定,搞过py的人都知道包有别名这种坑人现象是大概率事件。
命令如下:
dotnet tool install -g --add-source "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" Microsoft.dotnet-interactive
这个时候你的内核才算安装成功,但是到底成功没有呢,试一下吧,还有问题的话,我也无能为力了。
参考资料:
https://devblogs.microsoft.com/cesardelatorre/using-ml-net-in-jupyter-notebooks/
https://github.com/dotnet/interactive/issues/545
https://github.com/dotnet/interactive/blob/main/docs/NotebooksLocalExperience.md
Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET