H2O-3机器学习平台源码编译的各种坑

2024-04-13 11:12

本文主要是介绍H2O-3机器学习平台源码编译的各种坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

H2O-3机器学习平台是一个非常适合非专业人士学习机器学习的平台,自带WebUI,效果还是蛮不错的,官方也提供了jar包,一条命令就能直接运行,非常方便,但最近有源码编译的需求,实际操作过程中,发现,想要编译它的源码,真的比登天还难!

主要是因为,github的源码可以说是日更,成百上千的分支看的人眼花缭乱,而且编译说明文档是世纪更,可当前主线的代码完全对不上。

照着它的编译说明文档操作,绝对掉坑里爬不出来。在此记录一下我的具体编译流程:

一、虚拟机部署Centos7系统

下载Centos7镜像文件,使用版本“CentOS-7-x86_64-DVD-2009”,下载地址:https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

虚拟机安装centos7过程不在叙述,可参考:

VMware ESXI centos7虚机搭建详解(避坑必看)_esxi安装iso虚机-CSDN博客

虚拟机安装Centos7系统实操教程 详尽步骤 vmware ESXi亲测通过 - 运维全实践 - 博客园 (cnblogs.com)注意安装过程中,软件选择“基础设施服务器”

二、部署H2O-3环境

官方使用了jdk-7u79版本,编译会出现“PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target”错误,所以弃用。

完整环境部署代码如下:

cd /opt
sudo wget https://packages.baidu.com/app/jdk-8/jdk-8u121-linux-x64.tar.gzsudo tar xzf jdk-8u121-linux-x64.tar.gz
cd jdk-8u121-linux-x64sudo alternatives --install /usr/bin/java java /opt/jdk1.8.0_121/bin/java 2
sudo alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_121/bin/jar 2
sudo alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_121/bin/javac 2
sudo alternatives --set jar /opt/jdk1.8.0_121/bin/jar
sudo alternatives --set javac /opt/jdk1.8.0_121/bin/javaccd /optsudo wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
sudo rpm -ivh epel-release-7-14.noarch.rpmsudo echo "multilib_policy=best" >> /etc/yum.conf
sudo yum -y updatesudo yum -y install R R-devel git python-pip openssl-devel libxml2-devel libcurl-devel gcc gcc-c++ make openssl-devel kernel-devel texlive texinfo texlive-latex-fonts libX11-devel mesa-libGL-devel mesa-libGL nodejs npm python-devel numpy scipy python-pandasyum install python3-pip
pip3 install --upgrade pip
pip3 install scikit-learn grip tabulate statsmodels wheelmkdir ~/Rlibrary
export JAVA_HOME=/opt/jdk1.8.0_121
export JRE_HOME=/opt/jdk1.8.0_121/jre
export PATH=$PATH:/opt/jdk1.8.0_121/bin:/opt/jdk1.8.0_121/jre/bin
export R_LIBS_USER=~/Rlibrary# install local R packages
R -e 'install.packages(c("RCurl","jsonlite","statmod","devtools","roxygen2","testthat"), dependencies=TRUE, repos="http://cran.rstudio.com/")'cd
git clone https://github.com/h2oai/h2o-3.git
cd h2o-3

注意: h2oai的代码更新频率非常高,基于我编译时的版本拉了一个fork,如果你从官方拉的源代码编译时有问题,可以用我当前使用的代码:

git clone https://github.com/mogu1990/h2o-3.git

三、修改H2O-3代码

第一处:h2o-3/h2o-r/scripts/package_version_check_update.R

将文件末尾的代码:

dcf.file <- seek.files(c("h2o-3-DESCRIPTION.template","h2o-3-DESCRIPTION"))repos <- c(repos.dcf(dcf.file), "http://s3.amazonaws.com/h2o-r/cran-dev")
pkgs <- packages.dcf(dcf.file, which = "all")# try on windows/macosx
ans <- pkgs_check_update(pkgs, check_only=check_only, repos=repos) #, force_install="data.table") # allows to be fully up to dateif (!interactive()) {expect TRUEstatus <- if (isTRUE(ans)) 0 else 1q("no", status=0)
}

修改为:

#dcf.file <- seek.files(c("h2o-3-DESCRIPTION.template","h2o-3-DESCRIPTION"))#repos <- c(repos.dcf(dcf.file), "http://s3.amazonaws.com/h2o-r/cran-dev")
#pkgs <- packages.dcf(dcf.file, which = "all")# try on windows/macosx
#ans <- pkgs_check_update(pkgs, check_only=check_only, repos=repos) #, force_install="data.table") # allows to be fully up to dateif (!interactive()) {# expect TRUE#status <- if (isTRUE(ans)) 0 else 1q("no", status=0)
}

目的就是关闭它的R包更新检测,因为代码里请求的“http://s3.amazonaws.com/h2o-r/cran-dev”压根就打不开!!!让人震惊。

第二处:h2o-3/h2o-bindings/build.gradle

将第13、14行代码:

pythonexe = findProperty("pythonExec") ?: "python"
pipexe = findProperty("pipExec") ?: "pip"

改为:

pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"

这是因为,它最开始用的python2.7版本,但现在python2.7已经不支持更新,很多包用不成,所以要换成python3和pip3。

第三处:h2o-3/h2o-py/build.gradle

和第二处同理,第11、12行,改成

pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"

第四处:h2o-3/h2o-py-cloud-extensions/build.gradle

和第二处同理,第9、10行,改成

pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"

第五处:h2o-3-master/h2o-py-mlflow-flavor/build.gradle

和第二处同理,第9、10行,改成

pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"

第二处到第五处的修改实际上都是把python换成python3,pip换成pip3,有个取巧的办法,就是把python的软链接指向python3,pip的软链接指向pip3,就免的修改第2-第5处。

三、开始编译

官方文档说要执行:

./gradlew syncSmalldata
./gradlew syncRPackages --info
./gradlew build -x test --info

实际发现,./gradlew syncSmalldata不用执行,因为它是下载了一堆的csv文件用来测试的,下载的具慢,不要执行。所以我们应该这么执行:

./gradlew syncRPackages --info

先执行R包的同步更新,如果不修改第一处,这里绝对报错,执行成功后再执行:

./gradlew build -x test --info

这里千万要把-x test加上,如果不加,默认就要进行测试校验,问题一大堆,绝对编译失败。

编译成功后,bulid目录下会生成h2o.jar文件。使用命令

java -jar h2o.jar

即可启动服务,不报错的情况下,浏览器访问http://ip:54321即可打开web界面。

为啥访问不到?记着关闭centos7的防火墙!

这篇关于H2O-3机器学习平台源码编译的各种坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899976

相关文章

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和