2016-11-29 1 views
3

저는 스팍과 함께 아파치 스파크를 사용하여 ML 파이프 라인을 만듭니다. 내 파이프 라인에있는 트랜스포머 중 하나가 초기에이 공정에서 비용이 많이 드는 join 작업을 수행합니다. 이후 많은 기능을 가지고 내 ParamGrid 이것은 프로그램이 엄청난 보유하고, 그리드의 각 기능을 통해 최적화 동안 메모리에 DataFrame 합류 것을 의미합니다.스파크 MLLib 변압기에서 UID의 역할 이해

이 문제를 해결하기 위해이 큰 중간 크기 인 DataFrame을 S3에있는 쪽모이에 작성하고 쪽모이 세공에서 읽은 DataFrame을 반환하여 사용자 지정 Transformer을 만들었습니다. 이것은 잘 작동하고 모델 의 속도를까지 증가 시켰습니다. 캐싱 단계 전에 준비된 기능을 ParamGrid에 추가했습니다. 나는 불꽃이 ParamGrid을 통해 최적화 할 때마다 ... 내 신념, 그것은 어떤 수업을했다 것을 uid가 작동하는 방법을 오해라고 생각

class Cacher(override val uid: String) extends Transformer { 

    // the cachePath variable determines the path within the S3 bucket 
    lazy val cachePath = Identifiable.randomUID(uid + "transformer-cache") 

    // ... 

: 나는 S3에 마루를 쓸 때 나는에 의해 결정되는 경로를 사용 파이프 라인의 그 시점에서 상연되었고, 새로운 인스턴스가 생성되었고, 새롭고 독특한 uid을 부여하여이를 추적합니다. 스파크가 새 Transformer 인스턴스에 unique uid을 부여하지 않아 캐싱이 잘못되었다고 생각합니다. 즉 캐시의 새 인스턴스 Transformer이 생성 될 때마다 캐싱 된 여기 엔 나무 마루가 지속적으로 덮어 쓰여지고 있음을 의미합니다. 파이프 라인이 생성하는 스테이지의 각 인스턴스마다 고유 한 무작위 uid을 생성하는 방법에 대한 지침을 제공 할 수 있습니까?

건배! 단계별

답변

2

단계 :

  • uid은 (는 TransformerIdentifiable 연장 Params 연장 PipelineStage 확장)을 Identifiable 특성으로 요구된다. Identifiable 문서 uid is 따르면
  • :

    개체 및 그 유도체 위한 불변 고유 ID. 일반적으로

  • :

    • Params은 변경할 수 있습니다. 매개 변수를 설정하면 this이 반환되고 uid에는 영향을주지 않습니다.

    • copyingParams

      Boolean = true 
      
    • Boolean = true 
      
      enc.uid == enc_.uid 
      

      import org.apache.spark.ml.feature.OneHotEncoder 
      
      val enc = new OneHotEncoder() 
      val enc_ = enc.setInputCol("foo") 
      
      enc == enc_ 
      
      새로운 인스턴스를 생성하지만 계속 같은 uid (이전 지점에서 인용의 강조 부분 참조).
      Boolean = true 
      
  • 당신은 copying parent uid을 피하기 위해 copy method를 오버라이드 (override)을 시도 할 수 있지만 ParamsIdentifiable을 뒤에 모든 생각과 충돌 될 것으로 보인다

    Boolean = false 
    
    encCopy.uid == enc.uid 
    
    val encCopy = enc.copy(new org.apache.spark.ml.param.ParamMap()) 
    
    encCopy == enc 
    

    .

가능한 해결책 :

  • 전혀 변압기 uid를 사용하거나 매개 변수의 현재 설정에 경로 의존하지 마십시오.
  • 캐시 파일을 수동으로 쓰지 않고 기본 제공 캐싱 메커니즘 (Dataset.persist)을 사용하십시오. 이 문제는 당면 문제를 해결할뿐만 아니라 출구에서 자원을 공개하는 숨겨진 문제를 해결합니다.