<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Sims의 문제해결 저장소</title>
    <link>https://sims-solve.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 20 Jul 2026 19:16:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Sims.</managingEditor>
    <item>
      <title>KL Divergence 정리</title>
      <link>https://sims-solve.tistory.com/150</link>
      <description>&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Dc0PQlNQhGY&amp;amp;t=1681s&quot;&gt;https://www.youtube.com/watch?v=Dc0PQlNQhGY&amp;amp;t=1681s&lt;/a&gt;&lt;/h1&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=Dc0PQlNQhGY&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bCaOpg/hyZK9oPj5y/jZ3TtgDnUymcGjEC7hbxI0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=120_386_1154_572,https://scrap.kakaocdn.net/dn/rwsqt/hyZLv7HRHt/CMKI8QLuJoysw04r4TyU4K/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=120_386_1154_572&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;가장 쉬운 KL Divergence 완전정복!&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Dc0PQlNQhGY&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 영상을 참고하였습니다.&lt;/p&gt;
&lt;h1 data-pm-slice=&quot;1 1 []&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-pm-slice=&quot;1 1 []&quot;&gt;H의 정의&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한가지 사건 일때&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(가정) A&amp;rarr;B에게 정보를 보내려고 한다 : 통신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해가 &amp;lsquo;동쪽&amp;rsquo;에서 떴다! 라는 소리는 당연한 소리 = 확률이 높은 상황 = 정보량이 없음( 당연함 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해가 &amp;lsquo;서쪽&amp;rsquo;에서 떴다! 라는 정보 공유 = 확률이 낮은 상황 = 정보량이 엄청나게 큼 ( 희귀한 상황 ) (놀람의 정도 = 정보량)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;h의 첫번째 조건&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccxKP8/dJMb9PTUEUY/9Yysd9VK3rINJE9WL3tCM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccxKP8/dJMb9PTUEUY/9Yysd9VK3rINJE9WL3tCM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccxKP8/dJMb9PTUEUY/9Yysd9VK3rINJE9WL3tCM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccxKP8%2FdJMb9PTUEUY%2F9Yysd9VK3rINJE9WL3tCM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;857&quot; height=&quot;424&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;두가지 사건 일때&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 해가 동쪽에서 떴고, 서울에 비가 왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보1 &amp;rarr; 해가 &amp;lsquo;동쪽&amp;rsquo;에서 떴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보2 &amp;rarr; 서울에 &amp;lsquo;비&amp;rsquo;가 왔다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;h의 두번째 조건&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rx0RR/dJMb80OCe2B/3Jc7H9I4kITAyjA4m5Lrz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rx0RR/dJMb80OCe2B/3Jc7H9I4kITAyjA4m5Lrz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rx0RR/dJMb80OCe2B/3Jc7H9I4kITAyjA4m5Lrz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frx0RR%2FdJMb80OCe2B%2F3Jc7H9I4kITAyjA4m5Lrz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;433&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5nxGt/dJMb8V0P8Fn/MCEguqrAybIR2xr8UhRkvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5nxGt/dJMb8V0P8Fn/MCEguqrAybIR2xr8UhRkvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5nxGt/dJMb8V0P8Fn/MCEguqrAybIR2xr8UhRkvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5nxGt%2FdJMb8V0P8Fn%2FMCEguqrAybIR2xr8UhRkvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;390&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clL8S6/dJMb9V7Aznu/v6h9WUtycmKuVzFLZCHrAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clL8S6/dJMb9V7Aznu/v6h9WUtycmKuVzFLZCHrAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clL8S6/dJMb9V7Aznu/v6h9WUtycmKuVzFLZCHrAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclL8S6%2FdJMb9V7Aznu%2Fv6h9WUtycmKuVzFLZCHrAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;188&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9UrpZ/dJMb9bWUiKl/661Dbc9CdtSHKSX8vDkAjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9UrpZ/dJMb9bWUiKl/661Dbc9CdtSHKSX8vDkAjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9UrpZ/dJMb9bWUiKl/661Dbc9CdtSHKSX8vDkAjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9UrpZ%2FdJMb9bWUiKl%2F661Dbc9CdtSHKSX8vDkAjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;188&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNHLHX/dJMb9PTUEVU/6qUDbL89BTYse2VsW410xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNHLHX/dJMb9PTUEVU/6qUDbL89BTYse2VsW410xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNHLHX/dJMb9PTUEVU/6qUDbL89BTYse2VsW410xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNHLHX%2FdJMb9PTUEVU%2F6qUDbL89BTYse2VsW410xK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;186&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS83AI/dJMb9N2RF8y/KikO1brBanhsIBZ6SEbhik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS83AI/dJMb9N2RF8y/KikO1brBanhsIBZ6SEbhik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS83AI/dJMb9N2RF8y/KikO1brBanhsIBZ6SEbhik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS83AI%2FdJMb9N2RF8y%2FKikO1brBanhsIBZ6SEbhik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;186&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU2mRb/dJMb9N2RF8M/WR1Ru9xBAnJ2ik9HQn4hq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU2mRb/dJMb9N2RF8M/WR1Ru9xBAnJ2ik9HQn4hq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU2mRb/dJMb9N2RF8M/WR1Ru9xBAnJ2ik9HQn4hq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU2mRb%2FdJMb9N2RF8M%2FWR1Ru9xBAnJ2ik9HQn4hq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;431&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Zb35/dJMb9N2RF8S/hBjH9dYw9iQUf25KMTfy40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Zb35/dJMb9N2RF8S/hBjH9dYw9iQUf25KMTfy40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Zb35/dJMb9N2RF8S/hBjH9dYw9iQUf25KMTfy40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Zb35%2FdJMb9N2RF8S%2FhBjH9dYw9iQUf25KMTfy40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;323&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAJePc/dJMb9N2RF8V/fjkJUkj4RW35mWzWuwpN5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAJePc/dJMb9N2RF8V/fjkJUkj4RW35mWzWuwpN5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAJePc/dJMb9N2RF8V/fjkJUkj4RW35mWzWuwpN5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAJePc%2FdJMb9N2RF8V%2FfjkJUkj4RW35mWzWuwpN5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;855&quot; height=&quot;409&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P0cDe/dJMb9hphOfX/xChIe1nCRnowhCkjNb62i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P0cDe/dJMb9hphOfX/xChIe1nCRnowhCkjNb62i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P0cDe/dJMb9hphOfX/xChIe1nCRnowhCkjNb62i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP0cDe%2FdJMb9hphOfX%2FxChIe1nCRnowhCkjNb62i1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;147&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVVYfv/dJMb9Mv7wuJ/YKDPjcIJ1Pl0k3ekdRjc7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVVYfv/dJMb9Mv7wuJ/YKDPjcIJ1Pl0k3ekdRjc7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVVYfv/dJMb9Mv7wuJ/YKDPjcIJ1Pl0k3ekdRjc7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVVYfv%2FdJMb9Mv7wuJ%2FYKDPjcIJ1Pl0k3ekdRjc7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;448&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Deep-learning</category>
      <category>cross entropy</category>
      <category>KL Diversence</category>
      <category>KLD</category>
      <category>크로스엔트로피</category>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/150</guid>
      <comments>https://sims-solve.tistory.com/150#entry150comment</comments>
      <pubDate>Sun, 19 Oct 2025 18:14:19 +0900</pubDate>
    </item>
    <item>
      <title>[DDP] DDP 학습 속도가 너무 느릴때</title>
      <link>https://sims-solve.tistory.com/149</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DDP에 대해 아무것도 모르는 상태에서 DDP 학습 속도가 단일 GPU로 돌리는 것보다 느린 경우를 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 그런 상황이 발생했는지 경험을 공유한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 일반 싱글 GPU에서 모델 예측하듯이 했던것이 문제다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;predicts&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;images&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;) &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDP로 wrapper 된 model의 경우, 이렇게 사용할 시 예측은 가능하지만, 모든 GPU를 물고서 예측을 하는 것이기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실상 순차적으로 예측을 진행하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, DDP의 핵심인 병렬적으로 처리를 하는게 아니다. 그럼 어떻게 해야할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;predicts&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.module(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;images&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;## model(images)를 하게되면 DDP 모델이기 때문에 속도 느림 &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.module로 하면 DDP 통신의 hook이 빠져서 개별적으로 GPU를 사용한다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>적어놓으면 쓸모있는 코드</category>
      <category>DDP</category>
      <category>느린이유</category>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/149</guid>
      <comments>https://sims-solve.tistory.com/149#entry149comment</comments>
      <pubDate>Sat, 17 May 2025 21:01:41 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 엑셀 HYPERLINK 그대로 가져오기</title>
      <link>https://sims-solve.tistory.com/148</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b92fQL/btsNAaAKx0e/llp4Fl2vvEfpZ9bU3HbkAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b92fQL/btsNAaAKx0e/llp4Fl2vvEfpZ9bU3HbkAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b92fQL/btsNAaAKx0e/llp4Fl2vvEfpZ9bU3HbkAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb92fQL%2FbtsNAaAKx0e%2Fllp4Fl2vvEfpZ9bU3HbkAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;316&quot; height=&quot;134&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엑셀에서 위와같이 E행에 하이퍼링크가 되어있을때, 판다스로 읽어와야 할 경우가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 읽을 수 있는법은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1745568777176&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from openpyxl import load_workbook
file = &quot;파일위치&quot;
wb = load_workbook(file, data_only= False) # openpyxl로 엑셀 읽기

sheet = &quot;Sheet1&quot; #현재 시트 이름 (자기에 맞게 변경해야함 )
ws = wb[sheet] # 해당 시트 읽기 

cell = ws.cell(row=셀의 row 위치(int), column= 셀의 column 위치 ( int) )  
colA = cell.value&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n0l0i/btsNzkqSqr0/8S0PfS080kDQpPKSSRGEA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n0l0i/btsNzkqSqr0/8S0PfS080kDQpPKSSRGEA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n0l0i/btsNzkqSqr0/8S0PfS080kDQpPKSSRGEA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn0l0i%2FbtsNzkqSqr0%2F8S0PfS080kDQpPKSSRGEA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;286&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 그대로 잘 가지고 오는 모습을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 가장 중요한건. load_workbook을 할때 data_only=False로 반드시 해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data_only=True 면 어떤 짓을 하더라도 &quot;네이버&quot;만 나오게 될 것이다.&lt;/p&gt;</description>
      <category>적어놓으면 쓸모있는 코드</category>
      <category>엑셀</category>
      <category>파이썬</category>
      <category>하이퍼링크</category>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/148</guid>
      <comments>https://sims-solve.tistory.com/148#entry148comment</comments>
      <pubDate>Fri, 25 Apr 2025 17:14:28 +0900</pubDate>
    </item>
    <item>
      <title>Docker VScode에 연결하기</title>
      <link>https://sims-solve.tistory.com/147</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;더이상 미룰 수 없는 Docker....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소 Local에서 Anaconda로 가상환경 따서 진행을 하다보니 Docker를 미루게 되어 더이상 안되겠다는 마음가짐으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소에 사용할 때 Anaconda 대신 Docker를 생성해서 진행하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러기 위해서는 Docker를 vscode에서 접속이 가능하도록 만들어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 Docker 설치가 되어있다는 가정하에서 진행하도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Docker 설치가 안되있다면, 설치 후 해보길 권장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Make Docker Container&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 Docker를 사용하는 방법에 익숙해지기 위한 것이므로, Docker hub에 있는 가장 최신의 python 이미지를 다운로드 받을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker pull python 을 통해 가장 최신 python이 설치된 이미지를 다운 받았다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ2xw5/btsMKRJVtUf/dKkkS5M922cIcgzIIepKkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ2xw5/btsMKRJVtUf/dKkkS5M922cIcgzIIepKkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ2xw5/btsMKRJVtUf/dKkkS5M922cIcgzIIepKkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ2xw5%2FbtsMKRJVtUf%2FdKkkS5M922cIcgzIIepKkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;643&quot; height=&quot;333&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이후 해당 이미지를 이용해 컨테이너를 하나 만들어 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그전에, 코딩하는 파일을 관리해야하니, 바인딩마운트를 이용해 임의의 폴더와 연동시켜보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JSXor/btsMK1S83gr/925T87JG0LQnrMXdVD9SV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JSXor/btsMK1S83gr/925T87JG0LQnrMXdVD9SV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JSXor/btsMK1S83gr/925T87JG0LQnrMXdVD9SV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJSXor%2FbtsMK1S83gr%2F925T87JG0LQnrMXdVD9SV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;189&quot; height=&quot;94&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바탕화면에는 'docker' 라는 폴더가 있고, 그 안에는 coding이라는 파일이 하나 있는 상태다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 폴더를 도커 안 기본이 되는 /mnt 폴더와 마운트 할 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHffJD/btsMLzaRFa6/2EKex5YiMFZ5GkA1fo7ll1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHffJD/btsMLzaRFa6/2EKex5YiMFZ5GkA1fo7ll1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHffJD/btsMLzaRFa6/2EKex5YiMFZ5GkA1fo7ll1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHffJD%2FbtsMLzaRFa6%2F2EKex5YiMFZ5GkA1fo7ll1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;761&quot; height=&quot;111&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'docker run -dit -v 바탕화면 폴더위치:/mnt 이미지명' 을 이용해 컨테이너를 하나 생성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 우리가 사용하고자 할 컨테이너를 하나 생성했으니, 이제 vscode에 연결시키는 작업을 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Vscode로 Docker 연결&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vscode에 좌측 extention에 들어가 Dev Containers와 Docker를 설치해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4qWXJ/btsMLZtslo5/iqyJC5PUlPKXRkKgw72wC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4qWXJ/btsMLZtslo5/iqyJC5PUlPKXRkKgw72wC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4qWXJ/btsMLZtslo5/iqyJC5PUlPKXRkKgw72wC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4qWXJ%2FbtsMLZtslo5%2FiqyJC5PUlPKXRkKgw72wC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;336&quot; height=&quot;284&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후, 다시 왼쪽 탭에 보면 Docker 아이콘이 생길 것이다. 그곳을 클릭하면 아래와 같이 어떤 컨테이너가 있는지 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8JbpZ/btsMMbNUgLZ/uNVfBNNpquHdrapxo8wGNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8JbpZ/btsMMbNUgLZ/uNVfBNNpquHdrapxo8wGNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8JbpZ/btsMMbNUgLZ/uNVfBNNpquHdrapxo8wGNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8JbpZ%2FbtsMMbNUgLZ%2FuNVfBNNpquHdrapxo8wGNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;337&quot; height=&quot;341&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLI로 생성한 컨테이너가 존재하는 것을 볼 수 있다. 그런데 우리는 해당 컨테이너 내부 파일들에 접근하여 코딩을 해야한다. 즉, Local에서 개발하듯, VScode에서 Docker 안에 파일 목록을 볼 수 있도록 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qYDgf/btsMLWKdkTx/j7ADbNxA3Qi5zbVEsWHV10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qYDgf/btsMLWKdkTx/j7ADbNxA3Qi5zbVEsWHV10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qYDgf/btsMLWKdkTx/j7ADbNxA3Qi5zbVEsWHV10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqYDgf%2FbtsMLWKdkTx%2Fj7ADbNxA3Qi5zbVEsWHV10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;402&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 컨테이너에다 마우스 우클릭을하여 'Attach Visual Studio Code'를 누르면 Local 환경의 폴더를 여는 것처럼 VScode에서 사용 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mtuqn/btsMMb8f1vs/4l5mUC66LZVp3Wd5EYSbR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mtuqn/btsMMb8f1vs/4l5mUC66LZVp3Wd5EYSbR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mtuqn/btsMMb8f1vs/4l5mUC66LZVp3Wd5EYSbR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMtuqn%2FbtsMMb8f1vs%2F4l5mUC66LZVp3Wd5EYSbR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;913&quot; height=&quot;404&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 컨테이너 내부로 들어와 Open할 Folder를 찾아야하는데, 우리는 Local PC의 임의의 폴더를 컨테이너 /mnt 폴더에다 마운트를 해놓은 상태다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 /mnt 폴더를 열어주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qoUSz/btsMLPxIuiT/cK7bvpWjVgphnQ9CyU6LvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qoUSz/btsMLPxIuiT/cK7bvpWjVgphnQ9CyU6LvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qoUSz/btsMLPxIuiT/cK7bvpWjVgphnQ9CyU6LvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqoUSz%2FbtsMLPxIuiT%2FcK7bvpWjVgphnQ9CyU6LvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;124&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이렇게 로컬 PC에서 만들어 놨던 파일이 잘 마운트되어있는 것을 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 VScode에서 Docker&lt;/p&gt;</description>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/147</guid>
      <comments>https://sims-solve.tistory.com/147#entry147comment</comments>
      <pubDate>Wed, 26 Mar 2025 20:06:08 +0900</pubDate>
    </item>
    <item>
      <title>[VectorDB] ChromaDB 정리</title>
      <link>https://sims-solve.tistory.com/146</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG를 적용하기 위해서 필요한 것이 이미 문서를 DB화 한 상태가 필요함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 DB에서 질문에 가장 유사한 내용을 추출하여 LLM prompt에 넣어줌으로써 LLM에게 환각을 방지하고, 보다 정확한 답변을 생성해 내기 위해 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼, 질문(Q)과 비슷한 내용은 어떻게 비교할 것인가? NLP에서 문자는 Vector로 표현하게 되고, Vector로 표현하게 해주는 것을 임베딩(Embedding)이라 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 내 내용을 모두 임베딩하여 저장을 한 후, 들어온 질문(Q)와 가장 유사하다고 판단되는 문장들을 뽑아내 사용하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, DB는 Vector를 저장해야 사용할 수 있는데, 대표적인 VectorDB는 ChromaDB, Faiss가 대표적인 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ChromaDB 사용법 정리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. ChromaDB 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739418860635&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import chromadb

# 크로마DB instance 생성  
cdb = chromadb.Client()

# 실질적 DB 생성 및 초기화
collection = cdb.create_collection(name=&quot;my_collection&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 데이터 넣기 ( add )&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739418961114&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 데이터 추가 
collection.add(
    documents=[
        &quot;This is a document about pineapple&quot;,
        &quot;This is a document about oranges&quot;
    ],
    ids=['1','2'],
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;add 함수를 이용하여 chromaDB에 데이터를 넣어줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 주의할 사항이 있습니다. &quot; ids값은 반드시 들어가야 하며 문자형이여야 한다. &quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;documents만큼 ids가 반드시 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 데이터 확인 ( get )&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739426112709&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;collection.add(
    documents=[
        &quot;This is a document about pineapple&quot;,
        &quot;This is a document about oranges&quot;
    ],
    ids=[str(uuid4()),str(uuid4())],
)

collection.get()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sitZF/btsMgtJdGPv/83ZrmIXajLHC0tkcCQsKzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sitZF/btsMgtJdGPv/83ZrmIXajLHC0tkcCQsKzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sitZF/btsMgtJdGPv/83ZrmIXajLHC0tkcCQsKzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsitZF%2FbtsMgtJdGPv%2F83ZrmIXajLHC0tkcCQsKzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;413&quot; height=&quot;200&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get 함수를 이용하면 DB안에 들어있는 데이터 전체를 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Note&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크로마DB는 VectorDB라는 이야기를 많이들 한다. Vector DB라고 들으면 텍스트의 Vector를 저장을 해야하는데 .get()을 통해 보면 &lt;b&gt;'embeddings' : None&lt;/b&gt; 이라는 부분이 보인다. 그외의 데이터는 잘 보여지는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 embeddings 값이 저장이 안되는건가? 라는 의심을 하게 만들어서 찾아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론은 단순히 '안보여주는 것' 일 뿐이다. 즉, 상식처럼 Vector Embedding값이 저장되는 DB이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 어떻게 embedding 값을 볼 수 있을까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfiwin/btsMh6Tkgi6/X0L6Z39nCgJ0fS16hLOf5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfiwin/btsMh6Tkgi6/X0L6Z39nCgJ0fS16hLOf5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfiwin/btsMh6Tkgi6/X0L6Z39nCgJ0fS16hLOf5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfiwin%2FbtsMh6Tkgi6%2FX0L6Z39nCgJ0fS16hLOf5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;661&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;get을 사용할때, include 파라미터에 embeddings를 넣어주면 뽑히는 것을 알 수 있다. 하지만, 여기서 조심해야할 것은 기존에 나왔던 documents, metadatas가 나오지 않는 것을 볼 수 있는데, 그 이유는 파라미터에 넣지 않아서 그런다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;include 파라미터의 dafault는 documents, metatdatas기 때문에 .get()만 했을때 embeddings가 나오지 않았던 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 검색( query )&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739426588253&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;collection.query(
    query_texts=[&quot;오늘 날씨 어때&quot;], # Chroma will embed this for you
    n_results=2, # how many results to return,
)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zMJou/btsMgw6MIB4/WZV2o6Bl6vCbwvoNgw8gM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zMJou/btsMgw6MIB4/WZV2o6Bl6vCbwvoNgw8gM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zMJou/btsMgw6MIB4/WZV2o6Bl6vCbwvoNgw8gM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzMJou%2FbtsMgw6MIB4%2FWZV2o6Bl6vCbwvoNgw8gM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;261&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chromaDB에서 검색은 .query()를 이용하여 진행할 수 있다. 쿼리로 입력된 텍스트를 Embedding을 거쳐 DB에 저장된 Embedding 값들과 유사도를 비교하여 최종적으로 거리가 멀지않은 ( 의미가 가장 가까운 ) 문장을 추출해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 4가지 함수를 이용해 ChromaDB를 다뤄보았다. 추가적으로 조건 검색, 제거 같은 것들은 해당 내용에 포함되지 않으니 공식 문서에서 찾아 적용해보길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.trychroma.com/docs/overview/introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.trychroma.com/docs/overview/introduction&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739426792998&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Introduction - Chroma Docs&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.trychroma.com&quot; data-og-source-url=&quot;https://docs.trychroma.com/docs/overview/introduction&quot; data-og-url=&quot;https://docs.trychroma.com/docs/overview/introduction&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.trychroma.com/docs/overview/introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.trychroma.com/docs/overview/introduction&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Introduction - Chroma Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.trychroma.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ADD</category>
      <category>chroma</category>
      <category>ChromaDB</category>
      <category>DB</category>
      <category>GET</category>
      <category>LLM</category>
      <category>query</category>
      <category>크로마</category>
      <category>크로마디비</category>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/146</guid>
      <comments>https://sims-solve.tistory.com/146#entry146comment</comments>
      <pubDate>Thu, 13 Feb 2025 15:06:38 +0900</pubDate>
    </item>
    <item>
      <title>[LLM] Fine-Tuning</title>
      <link>https://sims-solve.tistory.com/145</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;LLM을 하다보면 '모델명-it/chat'과 같은 형식으로 허깅페이스에서 제공하는 모델들을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 모델은 chatting 형식으로 fine-tuning하여 실제 모델과 이야기를 주고받는 형식으로 답변을 생성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 튜닝의 방식과 대표적인 데이터셋, 튜닝 방법에 대해 정리를 해보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SFT - Supervised Fine-Tuning ( 정답이 존재하는 상태에서 진행 - next token prediction )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SFT는 두가지로 나뉜다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Full Fine-Tuning&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모델 전체의 파라미터를 수정하여 학습시킨다. LLM은 대체로 파라미터가 상당히 많으므로 상당한 GPU 자원이 필요한 단점이 있다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) &lt;b&gt;Parameter-Efficient Fine-Tuning(PEFT)&lt;/b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모델의 '특정부분'만 파라미터를 업데이트 하는 방식. FFT보다 상대적으로 적은 GPU 자원이 필요함.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceKXYx/btsL259JtYL/gKKkU6vD5rkaLgjbnOqow1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceKXYx/btsL259JtYL/gKKkU6vD5rkaLgjbnOqow1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceKXYx/btsL259JtYL/gKKkU6vD5rkaLgjbnOqow1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceKXYx%2FbtsL259JtYL%2FgKKkU6vD5rkaLgjbnOqow1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;980&quot; height=&quot;482&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 PEFT 방식중에서는 LoRA 방식을 많이 사용함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LoRA&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnpObW/btsL24wfBUQ/3dXWafKuivfYfOSQU89n2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnpObW/btsL24wfBUQ/3dXWafKuivfYfOSQU89n2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnpObW/btsL24wfBUQ/3dXWafKuivfYfOSQU89n2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnpObW%2FbtsL24wfBUQ%2F3dXWafKuivfYfOSQU89n2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;463&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독립된 연산을 통해 LLM의 일부 파라미터와 결합한 형태로 vector값을 수정함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 Freeze한 상태라, 업데이트 되지 않으며, 독립적으로 연산되는 레이어만 업데이트를 진행하여 최소한의 파라미터로 LLM 모델을 튜닝할 수 있음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한마디로 &lt;b&gt;'어댑터'&lt;/b&gt;를 하나 만들어 적은 파라미터를 학습하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두가지 방식으로 어댑터를 모델에 추가할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) model.add_adapter(peft_config)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) get_peft_model(model, peft_config)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두가지 방법이 있어서 어떤 차이점이 있나 확인해보니, 둘다 큰 차이점은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Trainable parameters도 동일하며, 모델 내에서 LoRA가 적용되는 것 또한 동일하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한가지 차이점이라면, get_peft_model은 기본 모델을 wrapper로 한번 더 쌓아 model 구조를 출력해보면 PeftModelForCausalLM 이라는걸로 감싸져 있는 것을 볼 수 있는 정도였다. 내부적으로는 큰 차이가 없어 동일하다고 보면 된다. ( get_peft_model로 진행하면 차제적으로 구성해놓은 추가적인 함수들을 사용할 수 있다. )&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OPFQn/btsL2PZ3M9F/4nd78uguJngSYzaezmRTek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OPFQn/btsL2PZ3M9F/4nd78uguJngSYzaezmRTek/img.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;1160&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.6079%; margin-right: 10px;&quot; data-widthpercent=&quot;48.17&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OPFQn/btsL2PZ3M9F/4nd78uguJngSYzaezmRTek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOPFQn%2FbtsL2PZ3M9F%2F4nd78uguJngSYzaezmRTek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;1160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFtv9U/btsL4GHA3Pt/JHmJNmRp9rnzlDCKgmnzt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFtv9U/btsL4GHA3Pt/JHmJNmRp9rnzlDCKgmnzt1/img.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;1078&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.2293%;&quot; data-widthpercent=&quot;51.83&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFtv9U/btsL4GHA3Pt/JHmJNmRp9rnzlDCKgmnzt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFtv9U%2FbtsL4GHA3Pt%2FJHmJNmRp9rnzlDCKgmnzt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;1078&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;get_peft_model vs .add_adapter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 데이터셋&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;it / chat 형식으로 모델을 튜닝하려면, Q&amp;amp;A 데이터셋처럼 만들어서 최종적으론 chat template 형식으로 만들어 학습을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;손쉽게 사용해 볼 수 있는 데이터셋 예제를 한번 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drqoG1/btsL8F32p52/dMfJIr8rcWcdmn2KEiU1y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drqoG1/btsL8F32p52/dMfJIr8rcWcdmn2KEiU1y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drqoG1/btsL8F32p52/dMfJIr8rcWcdmn2KEiU1y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrqoG1%2FbtsL8F32p52%2FdMfJIr8rcWcdmn2KEiU1y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;177&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 Q &amp;amp; A 형태의 데이터셋을 이용하여 학습을 진행하기 위해서는 하나의 문장으로 만들어 주는 과정이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Dataset은 위와같은 feature를 가지고 있고 이중 instruction을 user, output을 model이 답변하는 형태로 진행을 해보려고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1Y30/btsL90TxWew/7A3eKvBeEgfj8J4kUnawQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1Y30/btsL90TxWew/7A3eKvBeEgfj8J4kUnawQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1Y30/btsL90TxWew/7A3eKvBeEgfj8J4kUnawQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1Y30%2FbtsL90TxWew%2F7A3eKvBeEgfj8J4kUnawQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;849&quot; height=&quot;224&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 it 형식으로 파인튜닝 된 모델을 사용할 예정이므로 기존의 chat template를 이용해서 만들어보도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqEX48/btsMafJHm0O/6nqLxmFTNPbbRiX4IdkPzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqEX48/btsMafJHm0O/6nqLxmFTNPbbRiX4IdkPzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqEX48/btsMafJHm0O/6nqLxmFTNPbbRiX4IdkPzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqEX48%2FbtsMafJHm0O%2F6nqLxmFTNPbbRiX4IdkPzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1101&quot; height=&quot;502&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 채팅 형식을 만들어 기존에 있는 dataset에 'text'에다가 새롭게 추가하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델에 학습을 위해서는, 모델이 읽을 수 있도록 숫자로 변환하는 Tokenize 과정이 한번 더 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 과정을 거치면, input_ids, attention_mask가 생기게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcltol/btsL8Umn4lf/RqUKUvWfqKZGB0aYAukUP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcltol/btsL8Umn4lf/RqUKUvWfqKZGB0aYAukUP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcltol/btsL8Umn4lf/RqUKUvWfqKZGB0aYAukUP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcltol%2FbtsL8Umn4lf%2FRqUKUvWfqKZGB0aYAukUP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;323&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 모델에 필요한 정보는 input_ids가 필요하다. !!반드시!!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;attention_mask의 경우는, Batch 처리를 하려면 Batch로 들어온 텍스트의 길이를 맞춰주기 위해 padding을 넣게되는데, 이렇게되면 의미없는 텍스트가 추가되는 것이라, 어디까지가 실제로 사용되야 할 텍스트인지 알아야 하는데, 이게 attention_mask를 통해 알 수 있다. ( 실제로, Padding을 넣지않고 학습에서 batch 진행해도 상관없음 - SFTTrainer)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습을 위해서는 input_ids ( token화된 결과물)이 필요하다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738839711717&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import transformers
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from peft import prepare_model_for_kbit_training, LoraConfig, get_peft_model
from datasets import load_dataset

from datasets import load_dataset
data = load_dataset(&quot;beomi/KoAlpaca-v1.1a&quot;)
data[&quot;train&quot;][0]

model_id = &quot;google/gemma-2-2b-it&quot;
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type=&quot;nf4&quot;,
    bnb_4bit_compute_dtype=torch.bfloat16
)

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config, device_map=&quot;auto&quot;)

def preprocessing(x):
     
    return tokenizer.apply_chat_template([
        {&quot;role&quot; : &quot;user&quot; , &quot;content&quot;: x['instruction']},
        {&quot;role&quot; : &quot;model&quot; , &quot;content&quot;: x[&quot;output&quot;]}
    ], tokenize = False)
    
data = data.map(
    lambda x: {'text': preprocessing(x) }
)
data = data.map(lambda samples: tokenizer(samples[&quot;text&quot;]), batched=True)
# make model
config = LoraConfig(
    r=8,
    lora_alpha=32,
    lora_dropout=0.05,
    bias=&quot;none&quot;,
    task_type=&quot;CAUSAL_LM&quot;
)

model = get_peft_model(model, config)
print(model.print_trainable_parameters())

from transformers import TrainingArguments , Trainer
from trl import SFTTrainer
# needed for gpt-neo-x tokenizer
tokenizer.pad_token = tokenizer.eos_token

training_args = TrainingArguments(
    output_dir=&quot;./keywords_gemma_results&quot;,
    # num_train_epochs=1, # 1epoch에 250step정도 진행함 
    # num_train_epochs가 기존에 알고있던 epoch 수
    num_train_epochs = 1,
    # max_steps를 지정하면, 배치사이즈에 상관없이 step으로 하기때문에 시간이 늘어남.
    # max_steps=800,
    per_device_train_batch_size=1,
    per_device_eval_batch_size=1,
    warmup_steps=0,
    weight_decay=0.01,
    learning_rate=2e-4,
    logging_dir=&quot;./logs&quot;,
    logging_steps=100,
    )


trainer = SFTTrainer(
    model=model,
    train_dataset=data[&quot;train&quot;],

    args=training_args,
    peft_config=config,
    # formatting_func=lambda x: x['input_ids']
)

trainer.train()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Deep-learning</category>
      <category>dataset</category>
      <category>LLM</category>
      <category>token</category>
      <category>Tokenizer</category>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/145</guid>
      <comments>https://sims-solve.tistory.com/145#entry145comment</comments>
      <pubDate>Thu, 6 Feb 2025 20:00:38 +0900</pubDate>
    </item>
    <item>
      <title>[LLM] Tokenizer 기본</title>
      <link>https://sims-solve.tistory.com/144</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Tokenizer 기본 선언 방식&lt;/p&gt;
&lt;pre id=&quot;code_1738235525799&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(CFG[&quot;model&quot;])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 본인이 사용하고자 하는 모델명, Tokenizer 위치를 파라미터에 넣어 불러오면 끝.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 위 방식으로 진행하면, 모델따로 토크나이저 따로 불러와 사용해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 한번에 할 수 있는게 바로 pipeline 함수.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738342341537&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pipline을 이용하여 추론
import transformers
from transformers import AutoModelForCausalLM ,BitsAndBytesConfig
# 4bit quantization
quantization_config = BitsAndBytesConfig(load_in_4bit=True,
                                         bnb_4bit_quant_type = &quot;nf4&quot;)


#  pipeline으로 진행하면, 자동으로 tokenizer도 불러옴 
pipline = transformers.pipeline(
    &quot;text-generation&quot;,
    model = CFG[&quot;model&quot;],
    model_kwargs = {'quantization_config' : quantization_config},
    device_map=&quot;auto&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 transformers.pipeline을 사용시 모델과 해당 모델에 사용되는 토크나이저를 한번에 받을 수 있음.&lt;/p&gt;
&lt;pre id=&quot;code_1738342401413&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipline.tokenizer
pipline.model&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 기존처럼 모델과 토크나이저에 접근이 가능하며 사용할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Chat 형식&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/main/ko/chat_templating&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/docs/transformers/main/ko/chat_templating&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738342467946&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;채팅 모델을 위한 템플릿&quot; data-og-description=&quot;(번역중) 효율적인 학습 기술들&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/docs/transformers/main/ko/chat_templating&quot; data-og-url=&quot;https://huggingface.co/docs/transformers/main/ko/chat_templating&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6bOPR/hyX7T2EIMx/4lHFRWVsQG87740za8Rj4k/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/cyhqCu/hyX72k0suM/ka69m9TAjiHC5Fchtl06d1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/main/ko/chat_templating&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/docs/transformers/main/ko/chat_templating&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6bOPR/hyX7T2EIMx/4lHFRWVsQG87740za8Rj4k/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/cyhqCu/hyX72k0suM/ka69m9TAjiHC5Fchtl06d1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;채팅 모델을 위한 템플릿&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;(번역중) 효율적인 학습 기술들&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 하면서 가장 많이 활용하는 것이 chat모델일 것임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델명-chat / 모델명-it 과 같이 허깅페이스에 저장된 모델들이 있는데, 이것들이 바로 채팅을 위해 finetuning된 모델임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 대기업에서 모델을 개발하여 배포하는 것 ( ex. google/gemma-7b )은 next token generation으로 pretrain한 모델이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 모델을 base로 사용자들은 번역, 요약과 같은 여러가지 DownStreamTask로 FineTuning을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chat 형식으로 답변을 출력할 수 있도록 DownStreamTask를 진행한다고 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 여기서 가장 헷갈렸던 부분이 있다. &quot;어떤 형식으로 chat Template를 구성해야 하는가? &quot;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러가지 모델이 있고, 각 모델별 스페셜 토큰도 다른데 구성을 어떻게 해야할까...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Pretrain 된 모델을 이용할 경우에는 자유롭게 만들어 주면 됨 ( 상대적으로 자유로움 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이미 chat/it 형식으로 finetuning된 모델을 이용할 경우, 기존 학습에 사용한 template를 사용하면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼, 1번의 경우는 큰 문제가 없지만, 2번의 경우는 어떤 형식인지 알아보기 위한 방법은 아래와 같음.&lt;/p&gt;
&lt;pre id=&quot;code_1738343580776&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pipline을 이용하여 추론
import transformers
from transformers import AutoModelForCausalLM ,BitsAndBytesConfig
import torch
import json
import huggingface_hub

with open('./settings/config.json') as f:
    CFG = json.load(f)

# Private Token value input &amp;amp; login
huggingface_hub.login(token = CFG[&quot;TOKEN&quot;])

CFG[&quot;model&quot;] = &quot;rtzr/ko-gemma-2-9b-it&quot;

# 4bit quantization
quantization_config = BitsAndBytesConfig(load_in_4bit=True,
                                         bnb_4bit_quant_type = &quot;nf4&quot;)


#  pipeline으로 진행하면, 자동으로 tokenizer도 불러옴 
pipline = transformers.pipeline(
    &quot;text-generation&quot;,
    model = CFG[&quot;model&quot;],
    model_kwargs = {'quantization_config' : quantization_config},
    device_map=&quot;auto&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 gemma를 it형식으로 학습시켜 놓은 모델을 pipeline을 이용하여 모델과 토크나이저를 불러왔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U63XW/btsL4z2PccU/ELmmXqcFyNtEquzIDKy8n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U63XW/btsL4z2PccU/ELmmXqcFyNtEquzIDKy8n0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U63XW/btsL4z2PccU/ELmmXqcFyNtEquzIDKy8n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU63XW%2FbtsL4z2PccU%2FELmmXqcFyNtEquzIDKy8n0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;503&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후, messages를 위 형태처럼 만들어주고, apply_chat_template를 이용하여 넣어주면 해당 모델에서 사용한 채팅형식에 맞춰서 프롬프트를 생성할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prompt의 출력물을 보면, &amp;lt;bos&amp;gt; &amp;lt;start_of_turn&amp;gt; &amp;lt;end_of_turn&amp;gt; 형식으로 작성되는 것을 볼 수 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습시킬때 위와같은 형식을 바탕으로 학습을 진행하여 해당 it 모델의 chat template은 위와같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3er83/btsL36NthEv/WrgX0kkV5EvgKvZpmaFrg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3er83/btsL36NthEv/WrgX0kkV5EvgKvZpmaFrg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3er83/btsL36NthEv/WrgX0kkV5EvgKvZpmaFrg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3er83%2FbtsL36NthEv%2FWrgX0kkV5EvgKvZpmaFrg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;572&quot; height=&quot;213&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성을 진행해보면 아래와 같은 결과물을 얻을 수 있다.(pipeline으로 추론을 진행하면, 끝나는 지점의 스페셜토큰을 볼 수 없기에 기존 generate 함수를 이용하여 진행하였다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 마지막 스페셜 토큰으로 &amp;lt;end_of_turn&amp;gt; &amp;lt;eos&amp;gt; 가 생성되어 더이상 생성을 멈춘 것도 볼 수 있다.&lt;/p&gt;</description>
      <category>Deep-learning</category>
      <category>LLM</category>
      <category>Tokenizer</category>
      <category>토크나이저</category>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/144</guid>
      <comments>https://sims-solve.tistory.com/144#entry144comment</comments>
      <pubDate>Sat, 1 Feb 2025 14:43:47 +0900</pubDate>
    </item>
    <item>
      <title>[LLM] huggingface LLM 기본 내용 ( 양자화 )</title>
      <link>https://sims-solve.tistory.com/143</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/ko/llm_tutorial&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/docs/transformers/ko/llm_tutorial&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738159122788&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;대규모 언어 모델로 생성하기&quot; data-og-description=&quot;LLM 또는 대규모 언어 모델은 텍스트 생성의 핵심 구성 요소입니다. 간단히 말하면, 주어진 입력 텍스트에 대한 다음 단어(정확하게는 토큰)를 예측하기 위해 훈련된 대규모 사전 훈련 변환기 모&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/docs/transformers/ko/llm_tutorial&quot; data-og-url=&quot;https://huggingface.co/docs/transformers/ko/llm_tutorial&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3a62A/hyX73RdS2o/MYfBtzjBSZIfGVmUbOh5Qk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/d3npPz/hyX7RcagMH/HoTLKFJAVekIhE74vx8ysk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/ko/llm_tutorial&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/docs/transformers/ko/llm_tutorial&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3a62A/hyX73RdS2o/MYfBtzjBSZIfGVmUbOh5Qk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/d3npPz/hyX7RcagMH/HoTLKFJAVekIhE74vx8ysk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;대규모 언어 모델로 생성하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;LLM 또는 대규모 언어 모델은 텍스트 생성의 핵심 구성 요소입니다. 간단히 말하면, 주어진 입력 텍스트에 대한 다음 단어(정확하게는 토큰)를 예측하기 위해 훈련된 대규모 사전 훈련 변환기 모&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738159299829&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    &quot;mistralai/Mistral-7B-v0.1&quot;, device_map=&quot;auto&quot;, load_in_4bit=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;pretrained_model_name_or_path&lt;/b&gt; : huggingface에 등록된 모델 명 or 다운로드 한 모델 위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;device_map&lt;/b&gt; : CPU/GPU select&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;load_in_4bit&lt;/b&gt; : 4bit Quantization( 양자화 ) -&amp;gt; 모델 용량 Down / 추론속도 UP/ 정확도 Down&amp;nbsp; ( 단, 미래는 없어질 파라미터 이므로, 'BitsAndBytesConfig'를 통해 진행하면 좋다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** load_in_4bit = True를 했을때 정말 4bit으로 변경될까??&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttcY8/btsL3A77yUQ/36bW5y5a7c2oz861BpH000/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttcY8/btsL3A77yUQ/36bW5y5a7c2oz861BpH000/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttcY8/btsL3A77yUQ/36bW5y5a7c2oz861BpH000/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttcY8%2FbtsL3A77yUQ%2F36bW5y5a7c2oz861BpH000%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;493&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;load_in_4bit없이 모델을 불러오면, 위와같이 float32로 dtype이 정해지는 것을 볼 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;load_in_4bit을 한 후 모델을 불러왔을때 아래와 같음. 특이한건, dtype이 torch.uint8로 저장되며, 값도 Params4bit이라는 것에 들어가게 됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRi5xW/btsL2HUrgRU/KylyBshBE1j1alqsDPGDHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRi5xW/btsL2HUrgRU/KylyBshBE1j1alqsDPGDHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRi5xW/btsL2HUrgRU/KylyBshBE1j1alqsDPGDHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRi5xW%2FbtsL2HUrgRU%2FKylyBshBE1j1alqsDPGDHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;227&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 알 수 있는건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 4bit 양자화를 하더라도 저장되는 dtype은 8bit으로 저장하는 것을 알 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Params4bit이라는 Class를 통해 값이 저장되는 것을 볼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼, load_in_8bit이라면 어떻게 될까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bijHSH/btsL3rDqOTx/tS5RF5S9X7qPFVpGSdMRdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bijHSH/btsL3rDqOTx/tS5RF5S9X7qPFVpGSdMRdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bijHSH/btsL3rDqOTx/tS5RF5S9X7qPFVpGSdMRdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbijHSH%2FbtsL3rDqOTx%2FtS5RF5S9X7qPFVpGSdMRdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;539&quot; height=&quot;267&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때는 int8로 예상 가능한 type이 나온다.&amp;nbsp; 또, Int8Params라는 걸 이용해 값을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 결론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 4bit, 8bit은 어떠한(?) 방법을 통해 'int'형으로 바꾸는 것을 볼 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 어떻게 변경하는지는 추후에 알아봐야 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;u&gt;torch_dtype&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼, 모델을 정의할때 torch_dtype이란게 있는데 이건 뭘까?&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b5563; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #4b5563; text-align: start;&quot;&gt;기본적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;torch.nn.LayerNorm&lt;span style=&quot;background-color: #ffffff; color: #4b5563; text-align: start;&quot;&gt;과 같은 다른 모듈은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;torch.float16&lt;span style=&quot;background-color: #ffffff; color: #4b5563; text-align: start;&quot;&gt;으로 변환됩니다. 원한다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;torch_dtype&lt;span style=&quot;background-color: #ffffff; color: #4b5563; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;매개변수로 이들 모듈의 데이터 유형을 변경할 수 있습니다&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같은 내용이 있는 허깅페이스에서 볼 수 있다. 한마디로, 양자화를 하지 않는 부분의 layer의 type을 setting 한다는 의미다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rvTZU/btsL3li3sLI/FGScivxG1ON1J7wKVTOlHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rvTZU/btsL3li3sLI/FGScivxG1ON1J7wKVTOlHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rvTZU/btsL3li3sLI/FGScivxG1ON1J7wKVTOlHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrvTZU%2FbtsL3li3sLI%2FFGScivxG1ON1J7wKVTOlHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;237&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b21Uhk/btsL2SBhCvQ/FaL6LMFp2mkDcEh4TnJUfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b21Uhk/btsL2SBhCvQ/FaL6LMFp2mkDcEh4TnJUfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b21Uhk/btsL2SBhCvQ/FaL6LMFp2mkDcEh4TnJUfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb21Uhk%2FbtsL2SBhCvQ%2FFaL6LMFp2mkDcEh4TnJUfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;503&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwWS9F/btsL2c1j4LY/qvjMRSwdPrsR56ckSQ6Ds0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwWS9F/btsL2c1j4LY/qvjMRSwdPrsR56ckSQ6Ds0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwWS9F/btsL2c1j4LY/qvjMRSwdPrsR56ckSQ6Ds0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwWS9F%2FbtsL2c1j4LY%2FqvjMRSwdPrsR56ckSQ6Ds0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;352&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;torch_dtype를 float32로 설정하여 진행하면, 양자화 되지 않는 layer들은 torch.float32로 설정되는 모습을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼, default( torch.float16)으로 진행하면 어떻게 될까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o4dlS/btsL2GOJCx3/C19UkYOOXxzxzCrBZQAxhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o4dlS/btsL2GOJCx3/C19UkYOOXxzxzCrBZQAxhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o4dlS/btsL2GOJCx3/C19UkYOOXxzxzCrBZQAxhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo4dlS%2FbtsL2GOJCx3%2FC19UkYOOXxzxzCrBZQAxhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;662&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양자화가 적용되지 않는 layer들은 float16으로 되는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;float32와 float16의 모델 크기도 살펴보니, 당연히 float16의 모델 크기가 작은것을 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;BitsAndBytesConfig 파라미터 ( 4bit )&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bnb_4bit_compute_dtype&lt;/b&gt;&amp;nbsp; : input type의 형태가 다를시, 계산 타입을 변경하여 진행 ( 속도의 장점을 얻을 수 있음 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FP32 -&amp;gt; fp16 , bf16 형태로 계산 진행 ( 기본은 float32)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;gt; 추가 설명&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;양자화에서 forward, backward 는 4 bit 에서 일어나지만, gradient computation 과정에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #ffffff; color: #111827; text-align: start;&quot;&gt;float16, bfloat16, float32 등의 자료형으로 변환하여 진행해야 한다. 그러므로, 이에 맞는 자료형을 골라서 넣어주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bnb_4bit_quant_type&lt;/b&gt; :&amp;nbsp; bnb.nn.Linear4Bit 레이어 안에서 사용할 양자화 타입을 선택하는 것 ( fp4, nf4로 할 수 있음 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;bnb_4bit_quant_type&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;은 bnb.nn.Linear4bit layer의&amp;nbsp; quant_type을 설정해주는 것&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bk8PO/btsL3ZT7ZPE/CPlqt4syjsOq5levfiwRyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bk8PO/btsL3ZT7ZPE/CPlqt4syjsOq5levfiwRyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bk8PO/btsL3ZT7ZPE/CPlqt4syjsOq5levfiwRyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBk8PO%2FbtsL3ZT7ZPE%2FCPlqt4syjsOq5levfiwRyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;181&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;**FP4, NF4란?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; FP ( Floating Point ) &lt;span&gt;&amp;nbsp;&lt;/span&gt;-&amp;gt; 부동소수점으로 표현, 상대적으로 높은 정밀도 / 상대적으로 낮은 연산 속도&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; NF ( Non- Floating Point )&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&amp;gt; 정수로 표현 , 상대적으로 낮은 정밀도 / 상대적으로 높은 연산 속도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bnb_4bit_use_double_quant&lt;/b&gt; : 양자화 이후 한번 더 양자화 진행여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/ko/quantization/bitsandbytes&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/docs/transformers/ko/quantization/bitsandbytes&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738167777810&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;bitsandbytes&quot; data-og-description=&quot;bitsandbytes는 모델을 8비트 및 4비트로 양자화하는 가장 쉬운 방법입니다. 8비트 양자화는 fp16의 이상치와 int8의 비이상치를 곱한 후, 비이상치 값을 fp16으로 다시 변환하고, 이들을 합산하여 fp16으&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/docs/transformers/ko/quantization/bitsandbytes&quot; data-og-url=&quot;https://huggingface.co/docs/transformers/ko/quantization/bitsandbytes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sdeIe/hyX74bwesQ/JTKkNED0ocMWmnNKHfRTk1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/gC7Jk/hyX7TVm36Y/Rs8o3seKMSnuyWsWQZBP6K/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/ko/quantization/bitsandbytes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/docs/transformers/ko/quantization/bitsandbytes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sdeIe/hyX74bwesQ/JTKkNED0ocMWmnNKHfRTk1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/gC7Jk/hyX7TVm36Y/Rs8o3seKMSnuyWsWQZBP6K/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;bitsandbytes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;bitsandbytes는 모델을 8비트 및 4비트로 양자화하는 가장 쉬운 방법입니다. 8비트 양자화는 fp16의 이상치와 int8의 비이상치를 곱한 후, 비이상치 값을 fp16으로 다시 변환하고, 이들을 합산하여 fp16으&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>Deep-learning</category>
      <category>LLM</category>
      <category>Quantization</category>
      <category>양자화</category>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/143</guid>
      <comments>https://sims-solve.tistory.com/143#entry143comment</comments>
      <pubDate>Thu, 30 Jan 2025 02:14:13 +0900</pubDate>
    </item>
    <item>
      <title>[회고] 티스토리 오블완 챌린지 - 완 -</title>
      <link>https://sims-solve.tistory.com/142</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어느덧 티스토리에서 진행한 이벤트 오블완 챌린지가 마지막 날이 됐다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3주라는 시간이 정말 짧게 지나간 것 같다..( 회사 일때문에 그런지도.. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 2024년이 끝나가는 마당에 회사일에 치이고 퇴근 후 더이상 기운이 안나 추가적인 공부를 거의 안한 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 마침 티스토리에서 챌린지를 한다는 소식에 냉큼 참여했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 생각해봐도 정말 참여하기 잘 했다.&amp;nbsp; 평소 공부하고 싶었던 것을 해당 챌린지 삼아 공부하여 블로그에 정리해 놓는 아주 좋은 시간이 됐다. 덕분에 deep하게 모델에 대한 이해를 한층 더 강화할 수 있었고, 수정 사항을 발견하여 추후에는 수정하여 commit도 보내볼 참이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델뿐만 아니라 알고리즘 관련한 공부도 많이 진행했다. 취업하고 알고리즘에 관심이 뜸했는데, 챌린지를 참여해야 한다는 명목으로 다시금 알고리즘을 풀어보기 시작했다. 몇개 올리진 않았지만, 챌린지가 끝나고도 지속적으로 블로그에 글을 올리면서 나의 지식을 쌓아나갈 생각이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 챌린지는 마무리 되지만, 이번 챌린지를 발판삼아 올해의 마무리를 잘 해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고맙다! 티스토리!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R0J1u/btsKYBBiUfW/Aztjmj92rbEGwAbbKOhqh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R0J1u/btsKYBBiUfW/Aztjmj92rbEGwAbbKOhqh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R0J1u/btsKYBBiUfW/Aztjmj92rbEGwAbbKOhqh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR0J1u%2FbtsKYBBiUfW%2FAztjmj92rbEGwAbbKOhqh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;421&quot; height=&quot;904&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>회고</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <category>회고</category>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/142</guid>
      <comments>https://sims-solve.tistory.com/142#entry142comment</comments>
      <pubDate>Wed, 27 Nov 2024 20:42:03 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 최소신장트리 (MST) - 전력난</title>
      <link>https://sims-solve.tistory.com/141</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에도 MST 알고리즘 문제를 하나 풀어보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/6497&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/6497&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당문제도 MST 관련된 문제여서, 여기까지 풀어본다면 MST에 대한 개념은 충분히 잡을 수 있을 것이라 생각이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제도 오리지널 MST 알고리즘을 통해서 풀 수 있는 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MST 알고리즘에 관련해서 다시한번 기억해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. node, edge , value가 각각 주어지는 상황에서, 최소한의 value을 이용하여 모든 노드를 하나의 그래프에 속하도록 만드는 테스크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. edge의 총 개수는 node - 1로 MST를 구성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. MST는 유니온 파인드 알고리즘을 이용해서 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MST 문제를 풀때 위 내용만 기억하고 진행하면 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;푸는 순서에서도 기억해야할 것이 한가지 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Greedy 하게 풀기위해 value를 오름차순으로 정리하여 하나씩 간선을 이어가며 진행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Greedy하게 접근하는것이 유니온 파인드와는 다른점이니 기억하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. value 값으로 오름차순으로 정렬한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 유니온파인드 알고리즘을 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 두 노드가 같은 그래프(root노드가 같으면)면 넘어가고, 다르다면 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 3단계를 거쳐서 알고리즘을 작성하면 되므로 그렇게 어렵지 않게 MST문제를 풀 수 있을것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 다른분들과 속도의 차이가 조금 나서, 그 이유를 살펴본 결과 sort를 할때 value가 같은경우가 있을 것 같아 x[1]으로 추가적으로 soring을 진행했는데, 그럴필요 없었고 속도만 늦추는 상황이 발생했었다.&lt;/p&gt;
&lt;pre id=&quot;code_1732621189891&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

input = sys.stdin.readline
sys.setrecursionlimit(1000000)

while True:
  M, N = map(int,input().split())
  if M == 0 and N == 0 :
    break
  edge_list = []

  for _ in range(N):
    edge_list.append(list(map(int,input().split())))
  edge_list.sort(key = lambda x : (x[2]))

  parent = [ x for x in range(M + 1 )]

  def getParent(parent , n):
    if parent[n] == n:
      return n
    parent[n] = getParent(parent, parent[n])
    return parent[n]

  def Union(parent , n1, n2 ):
    pn1 = getParent(parent, n1 )
    pn2 =getParent(parent, n2 )

    if pn1 &amp;lt; pn2 :
      parent[pn2] = pn1
    else:
      parent[pn1] = pn2


  def find(parent, n1, n2 ):
    if getParent(parent , n1) == getParent(parent , n2):
      return True
    else:
      return False  

  total_sum = 0
  result = 0
  for i in edge_list:
    x,y,z = i
    total_sum += z
    
    if find(parent, x,y):
      result += z
      continue
    
    Union(parent, x, y)
    
  print(result)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>MST</category>
      <category>문제</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>오블완</category>
      <category>최소신장트리</category>
      <category>티스토리챌린지</category>
      <author>Sims.</author>
      <guid isPermaLink="true">https://sims-solve.tistory.com/141</guid>
      <comments>https://sims-solve.tistory.com/141#entry141comment</comments>
      <pubDate>Tue, 26 Nov 2024 20:41:06 +0900</pubDate>
    </item>
  </channel>
</rss>