

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# SageMaker AI Spark untuk contoh Scala
<a name="apache-spark-example1"></a>

Amazon SageMaker AI menyediakan perpustakaan Apache Spark ([SageMaker AI Spark](https://github.com/aws/sagemaker-spark/tree/master/sagemaker-spark-sdk)) yang dapat Anda gunakan untuk mengintegrasikan aplikasi Apache Spark Anda dengan AI. SageMaker Topik ini berisi contoh untuk membantu Anda memulai SageMaker AI Spark dengan Scala. Untuk informasi tentang perpustakaan SageMaker AI Apache Spark, lihat. [Apache Spark dengan Amazon AI SageMaker](apache-spark.md)

**Unduh Spark for Scala**

[Anda dapat mengunduh kode sumber dan contoh untuk pustaka Python Spark (PySpark) dan Scala dari repositori AI Spark. SageMaker ](https://github.com/aws/sagemaker-spark) GitHub 

Untuk petunjuk mendetail tentang menginstal perpustakaan SageMaker AI Spark, lihat [SageMaker AI Spark](https://github.com/aws/sagemaker-spark/tree/master/sagemaker-spark-sdk).

SageMaker AI Spark SDK untuk Scala tersedia di repositori pusat Maven. Tambahkan pustaka Spark ke proyek Anda dengan menambahkan dependensi berikut ke file Anda`pom.xml`:
+  Jika proyek Anda dibangun dengan Maven, tambahkan yang berikut ini ke file pom.xml Anda:

  ```
  <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>sagemaker-spark_2.11</artifactId>
      <version>spark_2.2.0-1.0</version>
  </dependency>
  ```
+ Jika proyek Anda bergantung pada Spark 2.1, tambahkan yang berikut ini ke file pom.xml Anda:

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

**Spark untuk contoh Scala**

Bagian ini memberikan contoh kode yang menggunakan pustaka Apache Spark Scala yang disediakan oleh SageMaker AI untuk melatih model SageMaker AI menggunakan `DataFrame` s di cluster Spark Anda. Ini kemudian diikuti dengan contoh tentang cara [Gunakan Algoritma Kustom untuk Pelatihan Model dan Hosting di Amazon SageMaker AI dengan Apache Spark](apache-spark-example1-cust-algo.md) dan[Gunakan SageMakerEstimator dalam Pipa Spark](apache-spark-example1-extend-pipeline.md).

Contoh berikut menampung artefak model yang dihasilkan menggunakan layanan hosting SageMaker AI. Untuk detail selengkapnya tentang contoh ini, lihat [Memulai: 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) Secara khusus, contoh ini melakukan hal berikut:
+ Menggunakan `KMeansSageMakerEstimator` untuk menyesuaikan (atau melatih) model pada data

  Karena contoh menggunakan algoritma k-means yang disediakan oleh SageMaker AI untuk melatih model, Anda menggunakan. `KMeansSageMakerEstimator` Anda melatih model menggunakan gambar angka satu digit tulisan tangan (dari kumpulan data MNIST). Anda memberikan gambar sebagai masukan`DataFrame`. Demi kenyamanan Anda, SageMaker AI menyediakan kumpulan data ini dalam bucket Amazon S3.

  Sebagai tanggapan, estimator mengembalikan `SageMakerModel` objek.
+ Mendapatkan kesimpulan menggunakan yang terlatih `SageMakerModel`

  Untuk mendapatkan kesimpulan dari model yang dihosting di SageMaker AI, Anda memanggil `SageMakerModel.transform` metode ini. Anda lulus `DataFrame` sebagai input. Metode ini mengubah input `DataFrame` ke yang lain `DataFrame` yang mengandung kesimpulan yang diperoleh dari model. 

  Untuk gambar input tertentu dari nomor satu digit tulisan tangan, inferensi mengidentifikasi cluster tempat gambar tersebut berada. Untuk informasi selengkapnya, lihat [Algoritma 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
```

Kode contoh melakukan hal berikut:
+ Memuat dataset MNIST dari bucket S3 yang disediakan oleh SageMaker AI (`awsai-sparksdk-dataset`) ke dalam Spark (): `DataFrame` `mnistTrainingDataFrame`

  ```
  // 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`Metode ini menampilkan 20 baris pertama dalam bingkai data:

  ```
  +-----+--------------------+
  |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
  ```

  Di setiap baris:
  + `label`Kolom mengidentifikasi label gambar. Misalnya, jika gambar angka tulisan tangan adalah digit 5, nilai labelnya adalah 5. 
  + `features`Kolom menyimpan vektor (`org.apache.spark.ml.linalg.Vector`) `Double` nilai. Ini adalah 784 fitur dari nomor tulisan tangan. (Setiap angka tulisan tangan adalah gambar 28 x 28 piksel, membuat 784 fitur.)
+ Membuat estimator SageMaker AI () `KMeansSageMakerEstimator` 

  `fit`Metode estimator ini menggunakan algoritma k-means yang disediakan oleh SageMaker AI untuk melatih model menggunakan input. `DataFrame` Sebagai tanggapan, ia mengembalikan `SageMakerModel` objek yang dapat Anda gunakan untuk mendapatkan kesimpulan.
**catatan**  
`KMeansSageMakerEstimator`Memperluas SageMaker AI`SageMakerEstimator`, yang memperluas 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)
  ```

   

  Parameter konstruktor memberikan informasi yang digunakan untuk melatih model dan menerapkannya pada SageMaker AI:
  + `trainingInstanceType`dan `trainingInstanceCount` —Identifikasi jenis dan jumlah instance komputasi ML yang akan digunakan untuk pelatihan model.
  + `endpointInstanceType`—Mengidentifikasi tipe instans komputasi ML yang akan digunakan saat menghosting model di AI. SageMaker Secara default, satu instance komputasi ML diasumsikan.
  + `endpointInitialInstanceCount`—Mengidentifikasi jumlah instance komputasi HTML yang awalnya mendukung titik akhir yang menghosting model di AI. SageMaker 
  + `sagemakerRole`— SageMaker AI mengasumsikan peran IAM ini untuk melakukan tugas atas nama Anda. Misalnya, untuk pelatihan model, ia membaca data dari S3 dan menulis hasil pelatihan (artefak model) ke S3. 
**catatan**  
Contoh ini secara implisit menciptakan klien SageMaker AI. Untuk membuat klien ini, Anda harus memberikan kredensil Anda. API menggunakan kredensil ini untuk mengautentikasi permintaan ke AI. SageMaker Misalnya, ia menggunakan kredensyal untuk mengautentikasi permintaan untuk membuat pekerjaan pelatihan dan panggilan API untuk menerapkan model menggunakan SageMaker layanan hosting AI.
  + Setelah `KMeansSageMakerEstimator` objek telah dibuat, Anda mengatur parameter berikut, digunakan dalam pelatihan model: 
    + Jumlah cluster yang harus dibuat oleh algoritma k-means selama pelatihan model. Anda menentukan 10 cluster, satu untuk setiap digit, 0 hingga 9. 
    + Mengidentifikasi bahwa setiap gambar input memiliki 784 fitur (setiap nomor tulisan tangan adalah gambar 28 x 28 piksel, membuat 784 fitur).
+ Memanggil metode estimator `fit`

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

  Anda meneruskan input `DataFrame` sebagai parameter. Model ini melakukan semua pekerjaan melatih model dan menerapkannya ke SageMaker AI. Untuk informasi selengkapnya, lihat [Integrasikan aplikasi Apache Spark Anda dengan AI SageMaker](apache-spark.md#spark-sdk-common-process). Sebagai tanggapan, Anda mendapatkan `SageMakerModel` objek, yang dapat Anda gunakan untuk mendapatkan kesimpulan dari model Anda yang digunakan di SageMaker AI. 

  Anda hanya memberikan masukan`DataFrame`. Anda tidak perlu menentukan jalur registri ke algoritma k-means yang digunakan untuk pelatihan model karena `KMeansSageMakerEstimator` mengetahuinya.
+ Memanggil `SageMakerModel.transform` metode untuk mendapatkan kesimpulan dari model yang digunakan di SageMaker AI.

  `transform`Metode ini mengambil input `DataFrame` as, mengubahnya, dan mengembalikan kesimpulan lain `DataFrame` yang mengandung kesimpulan yang diperoleh dari model. 

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

  Untuk kesederhanaan, kami menggunakan input yang `DataFrame` sama dengan `transform` metode yang kami gunakan untuk pelatihan model dalam contoh ini. `transform`Metode ini melakukan hal berikut:
  + Serialisasi `features` kolom dalam input `DataFrame` ke protobuf dan mengirimkannya ke titik akhir SageMaker AI untuk inferensi.
  + Deserialisasi respons protobuf menjadi dua kolom tambahan (`distance_to_cluster`dan`closest_cluster`) dalam transformasi. `DataFrame`

  `show`Metode ini mendapatkan kesimpulan ke 20 baris pertama dalam input`DataFrame`: 

  ```
  +-----+--------------------+-------------------+---------------+
  |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|
  +-----+--------------------+-------------------+---------------+
  ```

  Anda dapat menafsirkan data, sebagai berikut:
  + Nomor tulisan tangan dengan `label` 5 milik cluster 4 (`closest_cluster`).
  + Angka tulisan tangan dengan `label` 0 milik cluster 5.
  + Nomor tulisan tangan dengan `label` 4 milik cluster 9.
  + Nomor tulisan tangan dengan `label` 1 milik cluster 6.

**Topics**
+ [Gunakan Algoritma Kustom untuk Pelatihan Model dan Hosting di Amazon SageMaker AI dengan Apache Spark](apache-spark-example1-cust-algo.md)
+ [Gunakan SageMakerEstimator dalam Pipa Spark](apache-spark-example1-extend-pipeline.md)

# Gunakan Algoritma Kustom untuk Pelatihan Model dan Hosting di Amazon SageMaker AI dengan Apache Spark
<a name="apache-spark-example1-cust-algo"></a>

Di[SageMaker AI Spark untuk contoh Scala](apache-spark-example1.md), Anda menggunakan `kMeansSageMakerEstimator` karena contoh menggunakan algoritma k-means yang disediakan oleh Amazon SageMaker AI untuk pelatihan model. Anda dapat memilih untuk menggunakan algoritma kustom Anda sendiri untuk pelatihan model sebagai gantinya. Dengan asumsi bahwa Anda telah membuat gambar Docker, Anda dapat membuat sendiri `SageMakerEstimator` dan menentukan jalur Amazon Elastic Container Registry untuk gambar kustom Anda. 

Contoh berikut menunjukkan cara membuat `KMeansSageMakerEstimator` dari`SageMakerEstimator`. Di estimator baru, Anda secara eksplisit menentukan jalur registri Docker ke gambar kode pelatihan dan inferensi Anda.

```
import com.amazonaws.services.sagemaker.sparksdk.IAMRole
import com.amazonaws.services.sagemaker.sparksdk.SageMakerEstimator
import com.amazonaws.services.sagemaker.sparksdk.transformation.serializers.ProtobufRequestRowSerializer
import com.amazonaws.services.sagemaker.sparksdk.transformation.deserializers.KMeansProtobufResponseRowDeserializer

val estimator = new SageMakerEstimator(
  trainingImage =
    "811284229777.dkr.ecr.us-east-1.amazonaws.com/kmeans:1",
  modelImage =
    "811284229777.dkr.ecr.us-east-1.amazonaws.com/kmeans:1",
  requestRowSerializer = new ProtobufRequestRowSerializer(),
  responseRowDeserializer = new KMeansProtobufResponseRowDeserializer(),
  hyperParameters = Map("k" -> "10", "feature_dim" -> "784"),
  sagemakerRole = IAMRole(roleArn),
  trainingInstanceType = "ml.p2.xlarge",
  trainingInstanceCount = 1,
  endpointInstanceType = "ml.c4.xlarge",
  endpointInitialInstanceCount = 1,
  trainingSparkDataFormat = "sagemaker")
```

Dalam kode, parameter dalam `SageMakerEstimator` konstruktor meliputi:
+ `trainingImage`—Mengidentifikasi jalur registri Docker ke gambar pelatihan yang berisi kode kustom Anda.
+ `modelImage`—Mengidentifikasi jalur registri Docker ke gambar yang berisi kode inferensi.
+ `requestRowSerializer``com.amazonaws.services.sagemaker.sparksdk.transformation.RequestRowSerializer`—Menerapkan.

  Parameter ini membuat serial baris dalam input `DataFrame` untuk mengirimnya ke model yang dihosting di SageMaker AI untuk inferensi.
+ `responseRowDeserializer`—Menerapkan 

  `com.amazonaws.services.sagemaker.sparksdk.transformation.ResponseRowDeserializer`.

  Parameter ini mendeserialisasi respons dari model, yang di-host di SageMaker AI, kembali ke file. `DataFrame`
+ `trainingSparkDataFormat`—Menentukan format data yang digunakan Spark saat mengunggah data pelatihan dari a ke S3. `DataFrame` Misalnya, `"sagemaker"` untuk format protobuf, untuk nilai yang dipisahkan koma, dan `"csv"` untuk `"libsvm"` format libSVM. 

Anda dapat mengimplementasikan sendiri `RequestRowSerializer` dan `ResponseRowDeserializer` untuk membuat serial dan deserialisasi baris dari format data yang didukung kode inferensi Anda, seperti.libsvm atau.. csv.

# Gunakan SageMakerEstimator dalam Pipa Spark
<a name="apache-spark-example1-extend-pipeline"></a>

Anda dapat menggunakan `org.apache.spark.ml.Estimator` estimator dan `org.apache.spark.ml.Model` model, dan `SageMakerEstimator` estimator dan `SageMakerModel` model dalam `org.apache.spark.ml.Pipeline` pipeline, seperti yang ditunjukkan pada contoh berikut:

```
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.feature.PCA
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/")

// substitute your SageMaker IAM role here
val roleArn = "arn:aws:iam::account-id:role/rolename"

val pcaEstimator = new PCA()
  .setInputCol("features")
  .setOutputCol("projectedFeatures")
  .setK(50)

val kMeansSageMakerEstimator = new KMeansSageMakerEstimator(
  sagemakerRole = IAMRole(integTestingRole),
  requestRowSerializer =
    new ProtobufRequestRowSerializer(featuresColumnName = "projectedFeatures"),
  trainingSparkDataFormatOptions = Map("featuresColumnName" -> "projectedFeatures"),
  trainingInstanceType = "ml.p2.xlarge",
  trainingInstanceCount = 1,
  endpointInstanceType = "ml.c4.xlarge",
  endpointInitialInstanceCount = 1)
  .setK(10).setFeatureDim(50)

val pipeline = new Pipeline().setStages(Array(pcaEstimator, kMeansSageMakerEstimator))

// train
val pipelineModel = pipeline.fit(trainingData)

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

Parameter `trainingSparkDataFormatOptions` mengonfigurasi Spark untuk membuat serial ke protobuf kolom “ProjectedFeatures” untuk pelatihan model. Selain itu, Spark membuat serial untuk membuat protobuf kolom “label” secara default.

Karena kita ingin membuat kesimpulan menggunakan kolom “ProjectedFeatures”, kita meneruskan nama kolom ke dalam kolom. `ProtobufRequestRowSerializer`

Contoh berikut menunjukkan transformasi`DataFrame`:

```
+-----+--------------------+--------------------+-------------------+---------------+
|label|            features|   projectedFeatures|distance_to_cluster|closest_cluster|
+-----+--------------------+--------------------+-------------------+---------------+
|  5.0|(784,[152,153,154...|[880.731433034386...|     1500.470703125|            0.0|
|  0.0|(784,[127,128,129...|[1768.51722024166...|      1142.18359375|            4.0|
|  4.0|(784,[160,161,162...|[704.949236329314...|  1386.246826171875|            9.0|
|  1.0|(784,[158,159,160...|[-42.328192193771...| 1277.0736083984375|            5.0|
|  9.0|(784,[208,209,210...|[374.043902028333...|   1211.00927734375|            3.0|
|  2.0|(784,[155,156,157...|[941.267714528850...|  1496.157958984375|            8.0|
|  1.0|(784,[124,125,126...|[30.2848596410594...| 1327.6766357421875|            5.0|
|  3.0|(784,[151,152,153...|[1270.14374062052...| 1570.7674560546875|            0.0|
|  1.0|(784,[152,153,154...|[-112.10792566485...|     1037.568359375|            5.0|
|  4.0|(784,[134,135,161...|[452.068280676606...| 1165.1236572265625|            3.0|
|  3.0|(784,[123,124,125...|[610.596447285397...|  1325.953369140625|            7.0|
|  5.0|(784,[216,217,218...|[142.959601818422...| 1353.4930419921875|            5.0|
|  3.0|(784,[143,144,145...|[1036.71862533658...| 1460.4315185546875|            7.0|
|  6.0|(784,[72,73,74,99...|[996.740157435754...| 1159.8631591796875|            2.0|
|  1.0|(784,[151,152,153...|[-107.26076167417...|   960.963623046875|            5.0|
|  7.0|(784,[211,212,213...|[619.771820430940...|   1245.13623046875|            6.0|
|  2.0|(784,[151,152,153...|[850.152101817161...|  1304.437744140625|            8.0|
|  8.0|(784,[159,160,161...|[370.041887230547...| 1192.4781494140625|            0.0|
|  6.0|(784,[100,101,102...|[546.674328209335...|    1277.0908203125|            2.0|
|  9.0|(784,[209,210,211...|[-29.259112927426...| 1245.8182373046875|            6.0|
+-----+--------------------+--------------------+-------------------+---------------+
```