

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# SageMaker AI Spark for Scala 예시
<a name="apache-spark-example1"></a>

Amazon SageMaker AI는 Apache Spark 애플리케이션을 SageMaker AI와 통합하는 데 사용할 수 있는 Apache Spark 라이브러리([SageMaker AI Spark](https://github.com/aws/sagemaker-spark/tree/master/sagemaker-spark-sdk))를 제공합니다. 이 주제에는 Scala와 함께 SageMaker AI Spark를 시작하는 데 도움이 되는 예시가 포함되어 있습니다. SageMaker AI Apache Spark 라이브러리에 대한 자세한 내용은 [Amazon SageMaker AI와 Apache Spark](apache-spark.md) 섹션을 참조하세요.

**Spark for Scala 다운로드**

[SageMaker AI Spark](https://github.com/aws/sagemaker-spark) GitHub 리포지토리에서 Python Spark(PySpark) 및 Scala 라이브러리 둘 다에 대한 소스 코드 및 예시를 다운로드할 수 있습니다.

SageMaker AI Spark 라이브러리 설치에 대한 자세한 지침은 [SageMaker AI Spark](https://github.com/aws/sagemaker-spark/tree/master/sagemaker-spark-sdk)를 참조하세요.

SageMaker AI Spark SDK for Scala는 Maven 중앙 리포지토리에서 사용할 수 있습니다. `pom.xml` 파일에 다음 종속성을 추가하여 프로젝트에 Spark 라이브러리를 추가합니다.
+  프로젝트가 Maven으로 빌드된 경우 pom.xml 파일에 다음을 추가합니다.

  ```
  <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>sagemaker-spark_2.11</artifactId>
      <version>spark_2.2.0-1.0</version>
  </dependency>
  ```
+ 프로젝트가 Spark 2.1에 의존하는 경우 pom.xml 파일에 다음을 추가합니다.

  ```
  <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>sagemaker-spark_2.11</artifactId>
      <version>spark_2.1.1-1.0</version>
  </dependency>
  ```

**Spark for Scala 예시**

이 섹션에서는 Spark 클러스터에서 `DataFrame`을 사용하여 SageMaker AI에서 모델을 훈련하기 위해 SageMaker AI에서 제공하는 Apache Spark Scala 라이브러리를 사용하는 예시 코드를 제공합니다. 그런 다음 [Apache Spark와 함께 Amazon SageMaker AI에서 모델 훈련 및 호스팅을 위해 사용자 지정 알고리즘 사용](apache-spark-example1-cust-algo.md) 및 [Spark 파이프라인에서 SageMakerEstimator 사용](apache-spark-example1-extend-pipeline.md) 방법에 대한 예시가 이어집니다.

다음 예시에서는 SageMaker AI 호스팅 서비스를 사용하여 결과 모델 아티팩트를 호스팅합니다. 이 예시에 대한 자세한 내용은 [Getting Started: K-Means Clustering on SageMaker AI with SageMaker AI Spark SDK](https://github.com/aws/sagemaker-spark?tab=readme-ov-file#getting-started-k-means-clustering-on-sagemaker-with-sagemaker-spark-sdk)를 참조하세요. 이 예시에서는 구체적으로 다음을 수행합니다.
+ `KMeansSageMakerEstimator`를 사용하여 데이터에 모델을 조정(또는 훈련)

  예시에서는 SageMaker AI에서 제공하는 k-means 알고리즘을 사용하여 모형을 훈련하기 때문에 `KMeansSageMakerEstimator`를 사용합니다. MNIST 데이터세트에서 손으로 쓴 한 자리 숫자의 이미지를 사용하여 모델을 훈련합니다. 이미지를 입력 `DataFrame`으로 제공합니다. 편의를 위해 SageMaker AI는 이 데이터세트를 Amazon S3 버킷에 제공합니다.

  그 응답으로 예측기는 `SageMakerModel`객체를 반환합니다.
+ 훈련된 `SageMakerModel`를 사용한 추론 얻기

  SageMaker AI에서 호스팅된 모델로부터 추론을 얻으려면 `SageMakerModel.transform` 메서드를 직접적으로 호출합니다. `DataFrame`을 입력으로 전달합니다. 메서드는 입력 `DataFrame`을 모델에서 가져온 추론을 포함한 또 다른 `DataFrame`으로 변형합니다.

  한 자릿수의 수기 이미지의 경우 추론은 이미지가 속하는 클러스터를 식별합니다. 자세한 내용은 [k-means 알고리즘](k-means.md) 단원을 참조하십시오.

```
import org.apache.spark.sql.SparkSession
import com.amazonaws.services.sagemaker.sparksdk.IAMRole
import com.amazonaws.services.sagemaker.sparksdk.algorithms
import com.amazonaws.services.sagemaker.sparksdk.algorithms.KMeansSageMakerEstimator

val spark = SparkSession.builder.getOrCreate

// load mnist data as a dataframe from libsvm
val region = "us-east-1"
val trainingData = spark.read.format("libsvm")
  .option("numFeatures", "784")
  .load(s"s3://sagemaker-sample-data-$region/spark/mnist/train/")
val testData = spark.read.format("libsvm")
  .option("numFeatures", "784")
  .load(s"s3://sagemaker-sample-data-$region/spark/mnist/test/")

val roleArn = "arn:aws:iam::account-id:role/rolename"

val estimator = new KMeansSageMakerEstimator(
  sagemakerRole = IAMRole(roleArn),
  trainingInstanceType = "ml.p2.xlarge",
  trainingInstanceCount = 1,
  endpointInstanceType = "ml.c4.xlarge",
  endpointInitialInstanceCount = 1)
  .setK(10).setFeatureDim(784)

// train
val model = estimator.fit(trainingData)

val transformedData = model.transform(testData)
transformedData.show
```

이 예제 코드에서는 다음 작업을 수행합니다.
+ SageMaker AI(`awsai-sparksdk-dataset`)에서 제공한 S3 버킷에서 Spark `DataFrame`(`mnistTrainingDataFrame`)으로 MNIST 데이터세트를 로드합니다.

  ```
  // Get a Spark session.
  
  val spark = SparkSession.builder.getOrCreate
  
  // load mnist data as a dataframe from libsvm
  val region = "us-east-1"
  val trainingData = spark.read.format("libsvm")
    .option("numFeatures", "784")
    .load(s"s3://sagemaker-sample-data-$region/spark/mnist/train/")
  val testData = spark.read.format("libsvm")
    .option("numFeatures", "784")
    .load(s"s3://sagemaker-sample-data-$region/spark/mnist/test/")
  
  val roleArn = "arn:aws:iam::account-id:role/rolename"
  trainingData.show()
  ```

  `show` 메서드는 데이터 프레임의 첫 20개 행에 표시됩니다.

  ```
  +-----+--------------------+
  |label|            features|
  +-----+--------------------+
  |  5.0|(784,[152,153,154...|
  |  0.0|(784,[127,128,129...|
  |  4.0|(784,[160,161,162...|
  |  1.0|(784,[158,159,160...|
  |  9.0|(784,[208,209,210...|
  |  2.0|(784,[155,156,157...|
  |  1.0|(784,[124,125,126...|
  |  3.0|(784,[151,152,153...|
  |  1.0|(784,[152,153,154...|
  |  4.0|(784,[134,135,161...|
  |  3.0|(784,[123,124,125...|
  |  5.0|(784,[216,217,218...|
  |  3.0|(784,[143,144,145...|
  |  6.0|(784,[72,73,74,99...|
  |  1.0|(784,[151,152,153...|
  |  7.0|(784,[211,212,213...|
  |  2.0|(784,[151,152,153...|
  |  8.0|(784,[159,160,161...|
  |  6.0|(784,[100,101,102...|
  |  9.0|(784,[209,210,211...|
  +-----+--------------------+
  only showing top 20 rows
  ```

  각 행에서:
  + `label` 열은 이미지의 레이블을 식별합니다. 예를 들어 수기 숫자 이미지가 숫자 5인 경우 레이블 값은 5입니다.
  + `features` 열은 `Double`값의 벡터(`org.apache.spark.ml.linalg.Vector`)를 저장합니다. 수기 숫자에는 784개의 특징이 있습니다. (각 수기 숫자는 28 x 28픽셀 이미지로 특징이 784개입니다.)
+ SageMaker AI 예측기 생성 (`KMeansSageMakerEstimator`) 

  이 예측기의 `fit` 메서드는 SageMaker AI에서 제공하는 k-means 알고리즘을 사용하여 입력 `DataFrame`을 사용해 모델을 훈련합니다. 그 응답으로 추론을 얻는 데 사용할 `SageMakerModel`객체를 반환합니다.
**참고**  
`KMeansSageMakerEstimator`는 SageMaker AI `SageMakerEstimator`를 확장하고, 이는 Apache Spark `Estimator`를 확장합니다.

  ```
  val estimator = new KMeansSageMakerEstimator(
    sagemakerRole = IAMRole(roleArn),
    trainingInstanceType = "ml.p2.xlarge",
    trainingInstanceCount = 1,
    endpointInstanceType = "ml.c4.xlarge",
    endpointInitialInstanceCount = 1)
    .setK(10).setFeatureDim(784)
  ```

   

  생성자 파라미터는 모델을 훈련하고 SageMaker AI에 배포하는 데 사용되는 정보를 제공합니다.
  + `trainingInstanceType` 및 `trainingInstanceCount`- 모델 훈련에 사용할 ML 컴퓨팅 인스턴스의 유형 및 수를 식별합니다.
  + `endpointInstanceType` - SageMaker AI에서 모델을 호스팅할 때 사용할 ML 컴퓨팅 인스턴스 유형을 식별합니다. 기본적으로 하나의 ML 컴퓨팅 인스턴스가 수임됩니다.
  + `endpointInitialInstanceCount` - SageMaker AI에서 모델을 호스팅하는 엔드포인트를 처음 지원하는 ML 컴퓨팅 인스턴스의 수를 식별합니다.
  + `sagemakerRole` - SageMaker AI는 이 IAM 역할을 수임하여 사용자를 대신해 작업을 수행합니다. 예를 들어 모델 훈련의 경우 S3로부터 데이터를 읽고 훈련 결과(모델 아티팩트)를 S3에 씁니다.
**참고**  
이 예시는 명시적으로 SageMaker AI 클라이언트를 생성합니다. 이 클라이언트를 생성하려면 보안 인증을 입력해야 합니다. API는 이러한 자격 증명을 사용하여 SageMaker AI에 대한 요청을 인증합니다. 예를 들어, 이 API는 자격 증명을 사용하여 훈련 작업을 생성하기 위한 요청과 SageMaker AI 호스팅 서비스를 사용하여 모델을 배포하기 위한 API 직접 호출을 인증합니다.
  + `KMeansSageMakerEstimator` 객체가 생성된 이후 모델 훈련에서 사용되는 다음 파라미터를 설정합니다.
    + k-means 알고리즘이 모델 훈련 도중 생성해야 하는 클러스터 수입니다. 각 자리마다 하나씩 0\$19까지 총 10개의 클러스터를 지정합니다.
    + 각 입력 이미지에 784개의 특징이 있는지 식별합니다(각 수기 숫자는 28 x 28픽셀 이미지로 784개의 특징이 있음).
+ 예측기 `fit`메서드 호출

  ```
  // train
  val model = estimator.fit(trainingData)
  ```

  입력 `DataFrame`을 파라미터로 전달합니다. 모델은 모델을 훈련하고 SageMaker AI에 배포하는 모든 작업을 수행합니다. 자세한 내용은 단원을 참조하십시오[Apache Spark 애플리케이션과 SageMaker AI 통합](apache-spark.md#spark-sdk-common-process). 이에 대한 응답으로 SageMaker AI에 배포된 모델에서 추론을 얻는 데 사용할 수 있는 `SageMakerModel` 객체를 얻습니다.

  `DataFrame`만 입력하면 됩니다.. 모델 훈련에 사용되는 k-means 알고리즘에 대한 레지스트리 경로를 지정할 필요가 없습니다.`KMeansSageMakerEstimator`가 이를 알고 있기 때문입니다.
+ `SageMakerModel.transform` 메서드를 직접적으로 호출하여 SageMaker AI에 배포된 모델로부터 추론을 얻습니다.

  `transform` 메서드는 `DataFrame`을 입력으로 가져오고, 이를 변형하고, 모델에서 가져온 추론을 포함하는 또 다른 `DataFrame`을 반환합니다.

  ```
  val transformedData = model.transform(testData)
  transformedData.show
  ```

  간소화를 위해 이 예제에서 모델 훈련에 대해 사용하는 `DataFrame`메서드에 대해 동일한 `transform`을 입력으로 사용합니다. `transform` 메서드는 다음을 수행합니다.
  + 입력 `DataFrame`의 `features` 열을 protobuf에 직렬화하고 추론을 위해 이 열을 SageMaker AI 엔드포인트로 전송합니다.
  + protobuf 응답을 변형된 `DataFrame`의 2개의 추가 열(`distance_to_cluster` 및 `closest_cluster`)로 역직렬화합니다.

  `show` 메서드는 추론을 입력 `DataFrame`에 있는 최초 20개 행으로 전송합니다.

  ```
  +-----+--------------------+-------------------+---------------+
  |label|            features|distance_to_cluster|closest_cluster|
  +-----+--------------------+-------------------+---------------+
  |  5.0|(784,[152,153,154...|  1767.897705078125|            4.0|
  |  0.0|(784,[127,128,129...|  1392.157470703125|            5.0|
  |  4.0|(784,[160,161,162...| 1671.5711669921875|            9.0|
  |  1.0|(784,[158,159,160...| 1182.6082763671875|            6.0|
  |  9.0|(784,[208,209,210...| 1390.4002685546875|            0.0|
  |  2.0|(784,[155,156,157...|  1713.988037109375|            1.0|
  |  1.0|(784,[124,125,126...| 1246.3016357421875|            2.0|
  |  3.0|(784,[151,152,153...|  1753.229248046875|            4.0|
  |  1.0|(784,[152,153,154...|  978.8394165039062|            2.0|
  |  4.0|(784,[134,135,161...|  1623.176513671875|            3.0|
  |  3.0|(784,[123,124,125...|  1533.863525390625|            4.0|
  |  5.0|(784,[216,217,218...|  1469.357177734375|            6.0|
  |  3.0|(784,[143,144,145...|  1736.765869140625|            4.0|
  |  6.0|(784,[72,73,74,99...|   1473.69384765625|            8.0|
  |  1.0|(784,[151,152,153...|    944.88720703125|            2.0|
  |  7.0|(784,[211,212,213...| 1285.9071044921875|            3.0|
  |  2.0|(784,[151,152,153...| 1635.0125732421875|            1.0|
  |  8.0|(784,[159,160,161...| 1436.3162841796875|            6.0|
  |  6.0|(784,[100,101,102...| 1499.7366943359375|            7.0|
  |  9.0|(784,[209,210,211...| 1364.6319580078125|            6.0|
  +-----+--------------------+-------------------+---------------+
  ```

  다음과 같이 데이터를 해석할 수 있습니다.
  + `label` 5가 포함된 수기 숫자는 클러스터 4(`closest_cluster`)에 속합니다.
  + `label` 0이 포함된 수기 숫자는 클러스터 5에 속합니다.
  + `label` 4가 포함된 수기 숫자는 클러스터 9에 속합니다.
  + `label` 1이 포함된 수기 숫자는 클러스터 6에 속합니다.

**Topics**
+ [Apache Spark와 함께 Amazon SageMaker AI에서 모델 훈련 및 호스팅을 위해 사용자 지정 알고리즘 사용](apache-spark-example1-cust-algo.md)
+ [Spark 파이프라인에서 SageMakerEstimator 사용](apache-spark-example1-extend-pipeline.md)