很荣幸能够参加到这次的鲲鹏众智项目中,在这三个月的项目实践过程中受益匪浅。随着技术的发展,各种各样的人工智能产品相继面世。机器学习作为目前解决许多人工智能问题的主流方法,由于数据规模急速膨胀,其性能提升显得尤为重要。我们参与的鲲鹏众智机器学习算子开发三期项目的主要任务是采用 C++对 Huber 算子和 LBFGS-B 优化器算子进行开发和性能提升,并将其集成到 Spark 和 scikit-learn 中。
从性质上来说,本次项目更倾向于工程类,这就要求我们熟悉相关的开发技术。在项目实践过程中,我们遇到了许多问题,最后都一一高效解决,其中有一个关键技术我想在这里分享一下。
由于我们是 C++实现算子功能,需要实现 Spark 调用这些 C++算子并与 Spark 原有的算子功能保持一致。C++与 scala 作为两种不同的编程语言,我们不能直接调用,而是利用 java 提供的 JNI 对 C++代码进行调用。这其中就涉及到数据类型的转换,我们需要从 scala 输入数据,并传给 C++进行实际的运算。在数据转换的过程中,我们发现数组类型转换的方式有直接 copy,也有给与数组首地址,前者是新开辟一块内存并把内容 copy 到新内存上,后者是直接利用同一块内存的同一块数据。从时间性能及存储效率上考虑,我们自然而然想要后者。以 double 数组为例,在 JNI 提供的接口中有 GetDoubleArrayElements () 和 GetPrimitiveArrayCritical (),前者是直接 copy 的方式,后者是给与数组首地址。但是有个很神奇的地方是,GetPrimitiveArrayCritical () 这种方式会在一定的时间后把数组给释放掉了,这就导致在迭代过程中,在一定时间后数据直接出错了。所以在使用 GetPrimitiveArrayCritical () 来进行数据转换的时候,不适合在用时比较长的函数里面。
十分荣幸能参与到这个项目中,把自己所学的知识充分运用到项目实践上也是一件很开心的事。同时在项目实践过程中也学到了许多有用的知识,这对以后的生活工作都用重要帮助。
厦门大学--数值优化团队--黄振威
指导老师--黄文
从性质上来说,本次项目更倾向于工程类,这就要求我们熟悉相关的开发技术。在项目实践过程中,我们遇到了许多问题,最后都一一高效解决,其中有一个关键技术我想在这里分享一下。
由于我们是 C++实现算子功能,需要实现 Spark 调用这些 C++算子并与 Spark 原有的算子功能保持一致。C++与 scala 作为两种不同的编程语言,我们不能直接调用,而是利用 java 提供的 JNI 对 C++代码进行调用。这其中就涉及到数据类型的转换,我们需要从 scala 输入数据,并传给 C++进行实际的运算。在数据转换的过程中,我们发现数组类型转换的方式有直接 copy,也有给与数组首地址,前者是新开辟一块内存并把内容 copy 到新内存上,后者是直接利用同一块内存的同一块数据。从时间性能及存储效率上考虑,我们自然而然想要后者。以 double 数组为例,在 JNI 提供的接口中有 GetDoubleArrayElements () 和 GetPrimitiveArrayCritical (),前者是直接 copy 的方式,后者是给与数组首地址。但是有个很神奇的地方是,GetPrimitiveArrayCritical () 这种方式会在一定的时间后把数组给释放掉了,这就导致在迭代过程中,在一定时间后数据直接出错了。所以在使用 GetPrimitiveArrayCritical () 来进行数据转换的时候,不适合在用时比较长的函数里面。
十分荣幸能参与到这个项目中,把自己所学的知识充分运用到项目实践上也是一件很开心的事。同时在项目实践过程中也学到了许多有用的知识,这对以后的生活工作都用重要帮助。
厦门大学--数值优化团队--黄振威
指导老师--黄文