Skip to content

implement distributed architecture #3

Description

@incjung

Recently, I have forked your random-forest repo to implement distributed architecture.
I planed to use lfarm instead of lparallel.

In your current repo, I found 8 parts that are using lparallel.

  • make-refine-vector
  • make-refine-dataset
  • train-refine-learner-multiclass
  • set-activation-matrix!
  • make-forest
  • make-regression-forest
  • forest-feature-importance
  • forest-feature-importance-impurity

First of all, I begin to modify make-refine-vector and train-refine-learner-multiclass.

(defun lfarm-leaf-index-list-task (datamatrix datum-index forest)
  (lfarm:pmapcar
    (lambda (dtree)
      (let ((node (find-leaf (dtree-root dtree) datamatrix datum-index)))
        (node-leaf-index node)))
    (forest-dtree-list forest)))

(defun make-refine-vector (forest datamatrix datum-index)
  (let ((index-offset (forest-index-offset forest))
        (n-tree (forest-n-tree forest)))
    (declare (optimize (speed 3) (safety 0))
             (type (simple-array double-float) datamatrix)
             (type (simple-array fixnum) index-offset)
             (type fixnum datum-index n-tree))
    (let ((leaf-index-list (lfarm-leaf-index-list-task datamatrix datum-index forest)))
      (let ((sv-index (make-array (forest-n-tree forest) :element-type 'fixnum))
            (sv-val (make-array (forest-n-tree forest)
                                :element-type 'double-float :initial-element 1d0)))
        (declare (type (simple-array fixnum) sv-index)
                 (type (simple-array double-float) sv-val))
        (loop for i fixnum from 0 to (1- n-tree)
              for index fixnum in leaf-index-list
              do (setf (aref sv-index i) (+ index (aref index-offset i))))
        (clol.vector:make-sparse-vector sv-index sv-val)))))

(lfarm:deftask pdotimes (class-id len sv-vec refine-dataset learners target)
  (loop for datum-id fixnum from 0 to (1- len) do
      (setf (clol.vector:sparse-vector-index-vector (svref sv-vec class-id))
            (svref refine-dataset datum-id))
      (clol:sparse-arow-update (svref learners class-id)
                               (svref sv-vec class-id)
                               (if (= (aref target datum-id) class-id) 1d0 -1d0)))
  (svref learners class-id))

(defun train-refine-learner-multiclass (refine-learner refine-dataset target)
  (let* ((len (length refine-dataset))
         (n-tree (length (svref refine-dataset 0)))
         (n-class (clol::one-vs-rest-n-class refine-learner))
         (learners (clol::one-vs-rest-learners-vector refine-learner))
         (sv-index (make-array n-tree :element-type 'fixnum :initial-element 0))
         (sv-val (make-array n-tree :element-type 'double-float :initial-element 1d0))
         (sv-vec (make-array n-class)))
    (loop for i fixnum from 0 to (1- n-class) do
      (setf (svref sv-vec i)
            (clol.vector:make-sparse-vector sv-index sv-val)))
    (let ((channel (lfarm:make-channel)))
      (dotimes (class-id n-class)
        (lfarm:submit-task channel #'pdotomes class-id len sv-vec refine-dataset learners target)
        (setf (svref learners class-id) (lfarm:receive-result channel))))
    ))

When I tried this, what I felt is :

In cl-random-forest, there are some reference objects (ex, learner, clol.vector, etc) in order to make forest model. lparallel can use setf or change those because it is working multi-threads on one process. But lfarm can not because it is running on different processes.

Could you give me any comments or helps? welcome to anything.

Thanks.

Inchul

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions